2016-11-15 68 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"