2016-11-15 65 views
4

我尝试将使用EF4初始开发的项目迁移到EF6,以利用EF6事务管理。在代码优先模式下使用上下文,代码是从数据库优先或模型优先开发的EDMX文件生成的

余米面临的问题是,该项目已使用数据库优先方法创建的,所以当我米使用像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. 

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

有什么想法?

感谢

编辑:

的事情是,它的使用与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" /> 

我尝试设置providerNameSystem.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.

+0

检查您的连接字符串。如果它不包含元数据部分,那么它将首先被假定为代码,如果它包含,那么它假定它是基于edmx的。所以有可能你有一个连接字符串来实例化这个缺少元数据部分的db上下文。 – reckface

+0

感谢您的回复。这就是事情开始变得怪异的地方。实例化我的dbcontext时,我尝试了两种连接字符串格式。当我使用代码优先的方法(没有元数据部分),我仍然得到上面提到的相同的错误,当我添加元数据部分时,它说“不支持关键字:'元数据'” – Podelo

+0

当你有元数据部分? – reckface

回答

4

将上下文从数据库优先转换为代码时最常见的错误是忘记删除生成的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#下数据选择ADO.NET实体数据模型并点击添加。然后从实体数据模型向导选择Code First从数据库并按照向导。欲了解更多信息,请参阅Entity Framework Code First to an Existing Database

+0

感谢您的回复。但是,即使我删除了onModelCreating方法,该异常仍然被抛出。我也尝试在连接字符串中用SqlClient替换EntityClient,但它不会改变任何内容。最后,我不能修改构造函数,因为我需要传递一个DbConnection并指定“contextOwnsConnection”参数。 – Podelo

+0

当您移除'throw new UnintentionalCodeFirstException();'时,您将不会收到相同的异常,除非您在基类中也有此方法。例如,由于使用错误的提供程序而收到的异常与您因模型创建中的该行代码而收到的异常不同。您应该按照答案中的所有说明来获得结果。也不要忽视* Note *部分。 –

+0

好吧我会试一试,我会有更多的时间 – Podelo

1

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

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

这适用于我。

0

我只是在web.config中的连接字符串这样

connectionString="metadata=res:///Models.wimEntities.csdl|res:///Models.wimEntities.ssdl|res://*/Models.wimEntities.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=DATABASE;persist security info=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient"