#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"
}
}
Указание на другой экземпляр базы данных с той же схемой — это изменение конфигурации, а не изменение кода.