Использование того же linq при переключении базы данных EF

#c# #.net #entity-framework #linq

#c# #.net #entity-framework #linq

Вопрос:

У меня есть база данных SQLServer, к которой я обращаюсь с помощью Entity Framework и запускаю запросы LINQ. Сделано на C #. Работает нормально.

Следующим шагом я хотел бы изменить строку подключения, чтобы она указывала на вторую базу данных с точно такой же структурой и выполняла запросы LINQ.

C # -> LINQ, будучи строго типизированным, не разрешает и не компилирует.

Я попытался создать объект DbContext, предоставив строку подключения, но объекты LINQ (имена таблиц) не разрешаются.

Я попробовал оператор switch для переключения между контекстами.

Я пробовал «DaContext.Database.ExecuteSqlCommand», но это не вариант, так как мне нужно переписать весь LINQ для использования базового SQL.

Каков наилучший способ добиться этого?

 DbContext DaContext;

// Here I changed the connectionstring dynamically
DaContext = new DbContext("HEADCOUNT_NEW_Entities");

// Here I tried a switch statement
switch (APPLICATION_ID)
{

case "HEADCOUNT_NEW":
    DaContext = new WebApplication7.Models.Db_Entities.HEADCOUNT_NEW_Entities();
    break;

case "POSTS_NEW":
    DaContext = new WebApplication7.Models.Db_Entities.POSTS_NEWEntities();
    break; 

// way more Databases to add here, same structure

}

DaContext.Database.ExecuteSqlCommand ("exactly not what i want to do..........");

// This does not resolve the TABS table in LINQ
var jsonData = DaContext.TABS
.Select(c => new { c.TAB_CONTENT, c.TABLE_NAME, c.SORT_SEQUENCE, c.LEVELS })
.Distinct()
.OrderBy(c => c.SORT_SEQUENCE)
.ToList();

// More LINQ to follow...
  

Ожидая, что пользователь войдет в систему, используйте другую базу данных EF с тем же LINQ.

Любые указатели приветствуются.

Комментарии:

1. Это работает, если базы данных имеют ТОЧНО такую же структуру, включая таблицы EF, например, миграции. Вы уверены, что они одинаковые? Или что строка подключения верна? Попробуйте войти в систему с помощью SQL Server Management Studio

2. Если единственное, что меняется, это строка подключения, тогда проблем быть не должно. Какова фактическая ошибка? Мне также непонятно, что вы пытаетесь сделать в этой switch структуре. Ваш DbContext должен быть строго типизированным контекстом с вашими сущностями в нем, а не только базовым DbContext типом в фреймворке. Этот код подразумевает, что у вас есть два разных контекста для двух разных схем.

3. Имя базы данных не является строкой подключения

4. Похоже, вы хотите выполнить один и тот же запрос, но для разных таблиц в базе данных? Каждая таблица в базе данных представляет собой отдельный класс в сущности. Итак, вам нужно будет создать интерфейс My_Query<T>, где T — таблица в сущности.

Ответ №1:

Вы создали два разных контекста БД:

  • WebApplication7.Models.Db_Entities.HEADCOUNT_NEW_Entities
  • WebApplication7.Models.Db_Entities.POSTS_NEWEntities

Код, который работает с одним, не будет работать с другим, потому что они разные, со своими разными наборами объектов. Кроме того, вы даже не используете эти контексты, а пытаетесь использовать базовый DbContext тип из фреймворка, в котором нет наборов сущностей:

 DbContext DaContext;
  

Избавьтесь от одного из контекстов БД и всех его объектов. Вам вообще не нужно дублировать код. Просто используйте контекст, соответствующий вашей схеме БД. Например:

 var daContext = new WebApplication7.Models.Db_Entities.HEADCOUNT_NEW_Entities();
// now you can query the entity sets on daContext
  

Как только у вас это получится, вернитесь к исходной задаче:

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

Строка подключения находится в конфигурации, а не в коде. Не меняйте никакого кода. Просто обновите строку подключения в конфигурации приложения. Например, в .config файле:

 <configuration>
  <connectionStrings>
    <add name="HEADCOUNT_NEW_Entities" connectionString="CONNECTION STRING GOES HERE" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>
  

Или в .json файле:

 {
  "ConnectionStrings": {
    "HEADCOUNT_NEW_Entities": "CONNECTION STRING GOES HERE"
  }
}
  

Указание на другой экземпляр базы данных с той же схемой — это изменение конфигурации, а не изменение кода.