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

本文关键字:代码 文件 开发 模型 EDMX 数据库 用于 模式 上下文 | 更新日期: 2023-09-27 18:17:57

我正尝试将最初使用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事务,所以它现在应该更像一个代码优先的模式。

另外,这里有一个context类:

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

如果我试图打开连接,而我保持连接字符串在数据库第一格式,我面临的例外Keyword metadata not supported,当我把连接字符串在代码第一格式,我面临的错误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.

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

将上下文从数据库优先转换为代码优先时最常见的错误是忘记删除生成的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") { /* . . .*/ }
    // . . . 
}

如果你想有一个通用的基类,遵循上面的说明。

注意:要先从现有数据库创建代码,您可以右键单击项目并选择添加新项,然后在Visual c# Data下选择ADO。. NET实体数据模型,然后单击添加。然后从实体数据模型向导从数据库选择代码优先并按照向导操作。有关更多信息,请参阅实体框架代码首先到现有数据库

您只需从App.config复制连接字符串并将其粘贴到您的Web。配置文件。

确保您的EDMX已更新到与数据库的最新连接。

我只是在web连接字符串。像这样配置

connectionString="metadata=res:///Models.wimEntities.csdl|res:///Models.wimEntities.ssdl|res://*/Models.wimEntities.msl;provider=System.Data.SqlClient;provider连接字符串="数据源=.;初始目录=DATABASE;持久安全信息=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.EntityClient"