【问题标题】:Using the same linq when switching EF database切换 EF 数据库时使用相同的 linq
【发布时间】:2019-04-12 12:19:41
【问题描述】:

我有一个 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。

任何指针表示赞赏。

【问题讨论】:

  • 如果数据库的结构完全相同,包括 EF 表,例如迁移,它就可以工作。你确定它们是一样的吗?或者连接字符串是正确的?尝试使用 SQL Server Management Studio 登录
  • 如果唯一改变的是连接字符串,那么应该没有问题。实际的错误是什么?我也不清楚你在switch 结构中要做什么。您的 DbContext 应该是一个包含实体的强类型上下文,而不仅仅是框架中的基本 DbContext 类型。此代码意味着您有两个 不同的 上下文用于两个 不同的 模式。
  • 数据库名称不是连接字符串
  • 您似乎想在数据库中的不同表上运行相同的查询?数据库中的每个表都是 Entity 中的不同类。所以你需要创建一个接口 My_Query ,其中 T 是 Entity 中的表。

标签: c# .net entity-framework linq


【解决方案1】:

您已经创建了两个不同的数据库上下文:

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

在一个上运行的代码不会在另一个上运行,因为它们是不同的,具有自己不同的实体集。此外,您甚至没有使用这些上下文,而是尝试使用框架中的基本 DbContext 类型,它有 no 组实体:

DbContext DaContext;

摆脱其中一个 DB 上下文及其所有实体。您根本不需要复制代码。只需使用与您的数据库架构匹配的上下文。例如:

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"
  }
}

指向具有相同架构的不同数据库实例是配置更改,而不是代码更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多