gpt4 book ai didi

c# - 上下文在代码优先模式下使用,代码是从 EDMX 文件生成的,用于数据库优先或模型优先开发

转载 作者:太空狗 更新时间:2023-10-30 00:49:07 25 4
gpt4 key购买 nike

我正在尝试将最初使用 EF4 开发的项目迁移到 EF6,以利用 EF6 事务管理。

我面临的问题是该项目是使用数据库优先方法创建的,因此当我使用像 context.Database.UseTransaction 这样的代码时,我遇到了以下错误:

The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development.

此异常在我的 DbContext 类的 OnModelCreating 方法内部触发。

有什么想法吗?

谢谢

编辑:

问题是它是使用 EDMX 和数据库优先方法的遗留代码。我必须在该项目中实现 EF6 事务,因此它现在应该更像是代码优先模式。

此外,这里是上下文类:

public class MyContext : BaseDbContext
{
public MyContext (DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, contextOwnsConnection)
{
}
}

和连接字符串:

  <add name="CS"
connectionString="Data Source=MyServ;Initial Catalog=MyDBName;User Id=MyUser;Password=MyPwd;Pooling=True;Min Pool Size=5;Max Pool Size=20;Persist Security Info=True;MultipleActiveResultSets=True;Application Name=EntityFramework;Enlist=false"
providerName="System.Data.EntityClient" />

我尝试将 providerName 设置为 System.Data.SqlClient 但它没有任何改变。

请注意,原始连接字符串是数据库优先格式:

<add name="OrderManagement"
connectionString="metadata=res://*/MyManagementModel.csdl|res://*/MyManagementModel.ssdl|res://*/MyManagementModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=MyServer;Initial Catalog=MyDBName;User Id=MyUser;Password=MyPwd;Pooling=True;Min Pool Size=5;Max Pool Size=20;Persist Security Info=True;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;"
providerName="System.Data.EntityClient" />

如果我尝试打开一个连接,同时保持数据库优先格式的连接字符串,我将面临异常不支持关键字元数据,当我首先将连接字符串放在代码中时格式,我正面临错误 The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development.

最佳答案

将上下文从数据库优先转换为代码优先时,最常见的错误是忘记删除生成的 OnModelCreating .在数据库优先的上下文中,OnModelCreating 抛出异常:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException(); // ← throws exception
}

因此,请查看您的上下文或其基类(及其分部类),如果它与上面的代码类似,您应该将其删除。

您的代码和配置也需要一些更改。

您正在将 providerName="System.Data.EntityClient" 用于代码优先上下文。您应该将连接字符串更改为如下内容:

<add name="MyContext" connectionString="data source=server;
initial catalog=database;User Id=user;Password=password;
multipleactiveresultsets=True;application name=EntityFramework"
providerName="System.Data.SqlClient" />

然后你应该将你的上下文构造函数更改为如下所示:

public partial class MyContext: DbContext
{
public MyContext() : base("name=MyContext") { /* . . .*/ }
// . . .
}

此外,如果您想要一个公共(public)基类,请按照上述说明进行操作。

注意:要从现有数据库创建代码优先,您可以右键单击项目并选择添加新项,然后在Visual C#数据 下选择ADO.NET 实体数据模型 并单击添加。然后从实体数据模型向导中选择Code First from Database并按照向导操作。有关详细信息,请参阅 Entity Framework Code First to an Existing Database

关于c# - 上下文在代码优先模式下使用,代码是从 EDMX 文件生成的,用于数据库优先或模型优先开发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40615044/

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