Pod*_*elo 5 .net c# entity-framework
我试图将最初使用EF4开发的项目迁移到EF6,以利用EF6事务管理。
我面临的问题是该项目是使用Database First方法创建的,因此,当我使用诸如的代码时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.
Run Code Online (Sandbox Code Playgroud)
此异常在OnModelCreating我的DbContext类的方法内触发。
任何的想法 ?
谢谢
编辑:
事实是使用EDMX和数据库优先方法的遗留代码。我必须在该项目内实现EF6事务,因此现在它应该更像是代码优先模式。
另外,这是上下文类:
public class MyContext : BaseDbContext
{
public MyContext (DbConnection existingConnection, bool contextOwnsConnection)
: base(existingConnection, contextOwnsConnection)
{
}
}
Run Code Online (Sandbox Code Playgroud)
和连接字符串:
<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" />
Run Code Online (Sandbox Code Playgroud)
我尝试将设置为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="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""
providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)
如果在我将连接字符串保留为数据库优先格式的同时尝试打开连接,则面临异常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.
将上下文从数据库优先转换为代码优先时,最常见的错误是忘记删除了generate OnModelCreating。在数据库优先的上下文中,OnModelCreating引发异常:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException(); // ? throws exception
}
Run Code Online (Sandbox Code Playgroud)
因此,请查看您的上下文或其基类(及其子类),如果它类似于上面的代码,则应将其删除。
此外,您的代码和配置也需要进行一些更改。
您正在使用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" />
Run Code Online (Sandbox Code Playgroud)
然后,您应该将上下文构造函数更改为以下形式:
public partial class MyContext: DbContext
{
public MyContext() : base("name=MyContext") { /* . . .*/ }
// . . .
}
Run Code Online (Sandbox Code Playgroud)
另外,如果您要使用通用的基类,请遵循上述说明。
注意:要从现有数据库中先创建代码,可以右键单击project并选择Add New Item,然后在Visual C#的Data下选择ADO.NET Entity Data Model并单击Add。然后从“ 实体数据模型向导”中选择“数据库中的代码优先”并遵循向导。有关更多信息,请参见实体框架代码优先于现有数据库