繁体   English   中英

EF6 查询使用错误的数据库

[英]EF6 Queries Using Wrong Database

我在 Windows Forms 应用程序 (.Net Framework 4.8) 中将 Devart dotConnect 用于 MySQL 和 Entity Framework 6。 我正在使用带有动态连接字符串的数据库优先方法。 我的应用程序可以连接到任意数量的数据库,所有这些数据库都具有相同的架构,因此我正在根据用户的输入构建连接字符串。 我在其他几个项目中使用过这种方法,以前从未遇到过这个问题。 我花了最后一天时间寻找报告类似问题的人,但没有运气。

我使用一个名为 entity_model 的空数据库(意味着没有数据,但有完整的模式)创建了我的 EDMX model。 我可以创建 DBContext 派生实体 class 的实例,我什至可以使用附加数据库在附加服务器上执行一般查询(例如获取已安装数据库的列表)。 我什至可以对连接字符串中标识的数据库执行 SQL 次查询(使用 DbContext.Database.SQLQuery),结果如我所料。 但是,当我尝试使用实体 class 的 DbSet 派生成员时,我的查询始终指向我用于生成 model 的数据库,而不管连接字符串中标识的数据库是什么。

单步执行代码,我可以看到实体 object 中的设置看起来都是正确的(entity.Database.Connection.ConnectionString 看起来完全符合我的预期,并且 entity.Database.Connection.Database 具有正确的数据库名称)。 但是,如果我检查任何 DbSet 对象的内部查询值 (DbSet.SQL),我会得到类似于以下内容的信息:

SELECT Extent1.ID, Extent1.Field1, Extent1.Field2, Extent1.Field3, FROM entity_model .table1 AS Extent1

其中entity_model是我用来创建 model 的数据库。我已经做了足够的测试,知道查询实际上是针对这个不正确的数据库执行的,而不是通过连接字符串传入的数据库。

正如我所说,我在其他项目中使用了相同的技术,但没有遇到这个问题。 我什至单步执行了一些旧代码,我可以看到 DbSet.SQL 字段的内容不包含对任何数据库的引用(无论是用于创建 model 的那个,还是来自连接字符串的那个)。 这也是我希望在我的新项目中看到的。

有人可以向我解释 EF 如何决定是否在 DbSet.SQL 字段中包含架构名称吗? 这让我有点疯狂。

我已经在我的机器上安装的 50 个左右的数据库中尝试了这个,所以我知道问题不在于任何特定的数据库。

我找到了这个问题的解决方案(实际上是 2 个解决方案)。 基本问题是 EF 默认使用 edmx EntitySet 元素中指定的架构:

<EntitySet Name="table1" EntityType="Self.table1" Schema="entity_model" store:Type="Tables" />

可以通过两种方式关闭此行为。 将以下行添加到您的应用程序启动代码中:

using Devart.Data.MySql.Entity.Configuration;
...
var config = MySqlEntityProviderConfig.Instance;
config.Workarounds.IgnoreSchemaName = true;

或者将以下部分添加到您的配置文件中:

在 configSections 元素内:

<section name="Devart.Data.MySql.Entity" type="Devart.Data.MySql.Entity.Configuration.MySqlEntityProviderConfigurationSection, Devart.Data.MySql.Entity.EF6, Version=8.21.2066.0, Culture=neutral, PublicKeyToken=09af7300eec23701"/>

然后在 configSections 元素之后:

<Devart.Data.MySql.Entity xmlns="http://devart.com/schemas/Devart.Data.MySql.Entity/1.0">
    <Workarounds IgnoreSchemaName="true"/>
</Devart.Data.MySql.Entity>

我在网上找到了第三个选项,那就是简单地从 edmx 文件中的每个 EntitySet 元素中删除架构名称,但我认为如果您尝试从数据库更新 model,这可能会导致一些问题。

我希望这个答案对以后的其他人有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM