2013-08-06 4 views
1

Я испытываю ментальный блок в поиске/поиске примера для этого сценария.SQL Server, строка динамических подключений Entity Framework,

Пользователь-A регистрируется и подключается к базе данных «master» на «abcServer» для подтверждения учетной записи. После утверждения сервер возвращает строку подключения для базы данных «unique-A» пользователю-A на «abcServer».

Я знаю, что DbContext в EF имеет конструктор присваивая имя connString, но я хочу, чтобы это было динамичным:

(1) DbContext

// dbContext constructor 
    public MasterDatabase() : base("name=MasterDatabase") 
    { 
     Configuration.LazyLoadingEnabled = false; 
    } 

(2) по умолчанию соединение

// web.config 
    <connectionStrings> 
    <add name="MasterDatabase" connectionString="Data Source=abcServer;Initial  
     Catalog=Master;Integrated Security=True;" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

Но, что это за га rd кодирование connStr. Остальная часть проекта касается соответствующего пользователя, работающего с классами EF в его/ее db, который не будет определен до тех пор, пока строка возврата не будет успешной. Нечто подобное:

(3) Метод в контроллере Изменение строки Conn

// in api controller, once log in successful, call to method return value as parameter 
    private void Connect2DbwithThisUsersConnString(string connStr) 
    { 
    // change the conn string & USE THIS CONTEXT to this user's db 
    } 

Любые примеры asp.net/mvc этого? Заранее спасибо. Иди сюда.

Помните: я не знаю строку подключения до входа в систему. Это может быть новый пользователь, требующий создания новой базы данных на лету, и что connStr прошел вместе. Я не могу жестко закодировать уникальную «базовую» или связную строку dbContext.

Большое спасибо за внимание!

ответ

0

Очень сложно (если не невозможно) изменить строку соединения DbContext после ее создания.

Вы можете сделать свою UniqueConnString функцию возвращает новый DbContext и создать новый конструктор в вашем MasterDatabase классе принимая строку подключения с помощью this конструктора в DbContext

private MasterDatabase GetUniqueConnString(string connStr) 
{ 
    return new MasterDatabase(connStr); 
} 


public MasterDatabase() : this("name=MasterDatabase") 
{ 
} 
public MasterDatabase(string nameOrConnectionString) : base(nameOrConnectionString) 
{ 
    Configuration.LazyLoadingEnabled = false; 
} 
1

Вы ищете Entity Framework мульти-аренду с пошаговый подход для каждого пользователя.

Вам нужны два совершенно разных контекста EF. Один, со строкой соединения в файлах conf, в базу данных входа. этот контекст содержит только связанные с подключением объекты/таблицы. После того, как логин подтвержден, конкретное место арендатора извлекается из базы данных входа в систему (контекст EF), а фактические данные обрабатываются с использованием другого контекста EF, который содержит для каждого объекта/таблицы арендатора. Этот контекст открывается с использованием правильно построенной строки подключения. все еще есть много проблем, которые вам придется решать, прежде всего на том, как решать не тривиальную проблему изменений схемы и обновлений баз данных (миграции).

Вы также должны прочитать о Entity Framework and Federations для другой базы подхода don SQL Azure.

+0

Ремус, я не хочу использовать Azure. Любые примеры с автономным сервером MsSql? К сожалению, опечатки, ссылки на не лазурные примеры? –

+0

Мой отзыв о не-лазурных версиях. Только финальные строки предполагают федерации в качестве альтернативы. –

+0

Все пользователи используют один и тот же контекст, но в diff dbs. Если я вношу изменения в классы, а migrations - true, я не вижу проблемы с изменениями схемы и обновлениями db. –

0

Это сработало для меня, кто-то видит ошибку или знает лучший способ?

// in controller/server // 
private static void Init(string connStr) 
var connString = "Data Source=abcServer;Initial Catalog=" + dbName + ";Integrated Security=True;"; 
var connBuilder = new SqlConnectionStringBuilder(connString); 
var defaultContext = new DefaultDb(); //Context #1 - default connection from web.config 
var otherContext = new OtherDb(connBuilder.ToString()); //Context #2 dynamic connection 
..... 
} 

// in OtherContext.cs // 
    public partial class OtherContext 
    { 
     public OtherContext(string connectionString) : base(connectionString) { } 
    } 

    public partial class OtherContext: DbContext 
    { 
     public OtherContext() : base("name=DefaultConnection") { } 
    } 

    // the migration file // 
    public class Configuration : DbMigrationsConfiguration<OtherContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 
      AutomaticMigrationDataLossAllowed = true; 
     } 
    }