EF6 - назначить сущности переменной - PullRequest
1 голос
/ 29 января 2020

Я работаю с 3 базами данных в EF. Эти базы данных имеют одинаковые таблицы, просто разные данные. Когда я получаю значение, мне нужно запросить указанную c базу данных. Пример:

  • Если я получу значение 1, я должен сделать запрос к базе данных 1.
  • .. значение 2, к базе данных 2.
  • .. значение 3, для базы данных 3.

Каждая база данных имеет свой объект / dbContext, очевидно:

  • Database1Entities
  • Database2Entities
  • Database3Entities

Интересно, есть ли способ присвоить сущность переменной, а затем передать эту переменную такому методу:

    public IQueryable<table> GetRecordsByNumBolla(string numBolla, **ENTITY**)
    {
        var dbContext = new **ENTITY**();
        var record = dbContext.Set<table1>().Where(x => x.number == numBolla);
        return record;
    }

Я знаю там Есть некоторые обходные пути к этой проблеме, однако, если это возможно, это оптимизирует код, и я напишу меньше

1 Ответ

1 голос
/ 29 января 2020

Вы упомянули, что 3 базы данных имеют одинаковые таблицы (т.е. схемы). Это означает, что эти базы данных могут быть представлены одинаковыми Entity/DbContext, но разными экземплярами. Запишите здесь, вам нужно 3 разных экземпляра одного и того же Entity/DbContext для доступа к данным в соответствующих базах данных.

Вы можете использовать подход для получения соответствующего ConnectionString и динамического создания DbContext. Как только вы получаете экземпляр DbContext, вы передаете его в качестве параметра функции GetRecordsByNumBolla для получения данных.

Фрагмент кода может быть следующим:

// The class that represents database schema based on which databases 
// are created. 
public partial class DatabaseEntity : DbContext
{
    public DatabaseEntity(string dbConn)
        : base(dbConn)
    {

    }
}

// This function creates instance of DbContext using connection string 
// for that database represented by parameter dbNumber. 
public DbContext GetDBContext(int dbNumber)
{
  //Get connection string which may be different for different database 
  string dbConnection = GetConnectionString(dbNumber);

  //Create appropriate instance
  var dbContext= new DatabaseEntity(dbConnection);

  return dbContext;
}

// Function to get data
public IQueryable<table> GetRecordsByNumBolla(string numBolla, DbContext dbContext)
{
  var record = dbContext.Set<table1>().Where(x => x.number == numBolla);
  return record;
}

private string GetConnectionString(int dbNumber)
{
    string connString = "";
    switch (dbNumber)
    {
        case 1:
            connString = @"server=localhost;database=DB1;uid=uid1;password=pwd1";
            break;
        case 2:
            connString = @"server=localhost;database=DB2;uid=uid2;password=pwd2";
            break;
        case 3:
            connString = @"server=localhost;database=DB3;uid=uid3;password=pwd3";
            break;
    }
    return connString;
}

//Code snippet to use these functions
var dbContext = GetDBContext(1); //For 1st database

var record = GetRecordsByNumBolla("XYZ",dbContext);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...