gpt4 book ai didi

c# - 使用 Database-First 时将现有连接传递给 DbContext 构造函数时出错

转载 作者:行者123 更新时间:2023-12-03 21:50:25 25 4
gpt4 key购买 nike

我正在尝试创建一个类来在数据库上执行工作,并且需要(或偏好)结合使用 DbContext 和良好的老式 ADO。嗯,EF 非常适合简化大量代码,但 ADO 仍有许多用途可用于 EF 尚无法处理的更复杂的方法。

MSDN 上的这个链接声明我可以将现有的 SqlConnection 传递到我的上下文中,如下所示:

using (var conn = new SqlConnection("..."))
{
conn.Open();
using (var context = new SampleContext(conn, contextOwnsConnection: false))
{
// Do Something
}
}

现在我使用的是数据库优先,所以这个构造函数不会作为标准出现。因此,我创建了一个新的分部类文件并创建了适当的构造函数,如下所示:

public partial class MyEntities : DbContext
{
public MyEntities(System.Data.Common.DbConnection conn, bool contextOwnsConnection = false)
: base(existingConnection: conn, contextOwnsConnection: contextOwnsConnection)
{

}
}

但是,当我在调用新 DbContext 构造函数时运行代码时,我在 EDMX 中收到 UnintentionalCodeFirstException() 错误文件:

“如果在代码优先模式下使用数据库优先和模型优先开发的 T4 模板生成的代码可能无法正常工作。要继续使用数据库优先或模型优先,请确保在执行应用程序的配置文件。要使用这些从数据库优先或模型优先生成的类,请使用代码优先添加使用属性或 DbModelBuilder API 的任何其他配置,然后删除引发此异常的代码。”

我是不是遗漏了一些明显的东西,还是不能用数据库优先来完成?

显然,我可以只使用两个连接,一个用于我的 SqlConnection 对象,另一个用于我的 DbContext 对象,但如果可以的话,自然我更愿意尽可能使用一个连接。

非常感谢任何帮助。为了全面披露,我使用的是 SQL-Server 2012、.NET 4.5.1、C# 和 EF6.0.2。

最佳答案

设计者使用的连接字符串不是常规的连接字符串。相反,它们是 EntityConnection 字符串。不同之处在于实体连接字符串包含有关在哪里可以找到描述模型的元数据的附加信息,这些元数据在设计时采用 edmx 的形式 - 阅读更多 here . Code First 仅使用常规连接字符串,因为它基于代码动态构建模型。因此,UnintentionalCodeFirstException 阻止用户将 CodeFirst 功能与 edmx 模型一起使用,因为该模型是在 edmx 中指定的,而不是在代码中指定的,如果允许,您将有效地最终使用两种不同的模型(一个来自 edmx,一个构建自代码)很可能不会同步,这会导致奇怪的行为,甚至可能导致数据损坏和崩溃/异常。由于 EntityConnection 派生自 DbConnection 并且只是包装常规连接,因此您可以在需要使用提供者连接的地方使用它。或者,您可以使用 StoreConnection 访问包装的提供程序连接。 EntityConnection 上的提供商。

关于c# - 使用 Database-First 时将现有连接传递给 DbContext 构造函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22102082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com