Подтвердить что ты не робот

Использование структуры сущностей в нескольких базах данных

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

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

Вот пример:

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

4b9b3361

Ответ 1

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) {  }
}

fooobar.com/questions/94291/...

Ответ 2

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

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

уже в автогенерированной Model.Context.cs папки edmx

Чтобы подключиться к нескольким базам данных во время выполнения, я создал другой конструктор, который принимает строку подключения как параметр, как показано ниже в том же файле Model.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();                 
    }
}