2013-07-30 3 views
24

Я пишу систему начисления заработной платы, которая будет интегрироваться с уже существующей системой. В исходной системе была основная база данных, которая обрабатывала управление пользователями и некоторую глобальную конфигурацию, ниже, что есть несколько баз данных, каждая из которых идентична по структуре, в основном каждая база данных - это одна база данных платежной ведомости для компаний, все они привязаны к основной базе данных, поскольку она принадлежит родительской которая имеет множество дочерних компаний, каждая из которых имеет собственный отдел кадров.Использование структуры сущности в нескольких базах данных

Что мне было интересно, если есть какой-либо способ, который я могу, на основе либо файла cookie, либо другого метода, в котором хранится какая компания, к которой они хотят подключиться, динамически изменять целевую базу данных сущностей на основе их ввода с использованием фильтра ?

Вот пример:

Пользователь А на сайт, страница загружается с имеющимися компаниями, которые пользователь имеет разрешения на доступ, пользователь будет выбрать компанию, у них есть права администратора в этой компании, они добавляют сотрудник, прежде чем это действие будет запущено, asp.net переключит строку подключения в соответствующую базу данных, а затем добавит запись.

+0

В лучшем случае вы будете в конечном итоге с 2-х контекстах, или есть некоторые обходные пути, но очень менее практичным и EF6 будет поддерживать множественный база данных. Вы можете проверить бета-версию, к тому времени, когда ваше приложение будет готово, EF6 будет выпущен. Но все БД являются частью одной организации, а затем объединяют их с дополнительным внешним ключом для CompanyID, который сделает одну БД и облегчит отчетность. –

+1

А я вижу, проблема в том, что человек, который сделал первую систему начисления заработной платы, очень категоричен в том, что мы сохраняем структуру базы данных одинаково, говорит он, чтобы компании были более готовы перейти на более новую версию, t необходимо выполнить любые миграции базы данных. – ChaoticLoki

+0

Ну, это кошмар для обслуживания, вы не сможете выполнять кросс-db-запросы с помощью соединений. Я не уверен в EF6, но вы можете проверить на codeplex. –

ответ

5

EF6 имеет лучшую поддержку для доступа нескольких БД из того же контекста. Вот фрагмент из EF5. Важное значение имеет управление настройкой инициализатора базы данных. Возможно, вы не захотите запускать ЛЮБЫЕ миграции. т.е., используйте перед

Database.SetInitializer(new ContextInitializerNone<MyDbContext>());

, но ответить на вопрос: Да, вы можете

var conn = GetSqlConn4DbName(dataSource,dbName); 
var ctx = new MyDbContext(conn,true); 



public DbConnection GetSqlConn4DbName(string dataSource, string dbName) { 
     var sqlConnStringBuilder = new SqlConnectionStringBuilder(); 
     sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource; 
     sqlConnStringBuilder.IntegratedSecurity = true; 
     sqlConnStringBuilder.MultipleActiveResultSets = true; 

     var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString); 
     var sqlConn = sqlConnFact.CreateConnection(dbName); 
     return sqlConn; 
    } 


public class ContextInitializerNone<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext 
{ 
    public void InitializeDatabase(TContext context) { } 
} 

Also see StackOverflow answer using migration, sample code, and dynamic db connection

22

Это очень просто. У меня есть:

public WMSEntities() : base("name=WMSEntities") //WMSEntities is conection string name in  web.config also the name of Entitiframework 
{ 
} 

уже автоматически сгенерированный Model.Context.cs из EDMX папки

Для подключения к несколько БДУ во время выполнения, я создал еще один конструктор, который принимает строку подключения в качестве параметра, как показано ниже в том же файл модели. Context.cs

public WMSEntities(string connStringName) 
    : base("name=" + connStringName) 
{ 
} 

Теперь я добавил другую строку соединения в web.config, например

<add name="WMSEntities31" connectionString="data source=TESTDBSERVER_NAME;initial catalog=TESTDB;userid=TestUser;password=TestUserPW/> 

<add name="WMSEntities" connectionString="data source=TESTDBSERVER_NAME12;initial catalog=TESTDB12;userid=TestUser12;password=TestUserPW12/> 

Затем, при подключении к базе данных я вызываю ниже метод прохождения имени connetionString в качестве параметра

public static List<v_POVendor> GetPOVendorList(string connectionStringName) 
{ 
    using (WMSEntities db = new WMSEntities(connectionStringName)) 
    {    
     vendorList = db.v_POVendor.ToList();     
    } 
} 
+0

Привет, это выглядит великолепно .... мой запрос, если он изменит модель базы данных, как это будет влиять. это будет кошмар обслуживания? – niku

+0

Что мы заново генерируем файл model.cs, чем мы снова должны добавить конфигурацию 'public WMSEntities (string connStringName) : base (" name = "+ connStringName) { }' –

Смежные вопросы