在n層解決方案中並行實現EntityFramework 6和EntityFramework Core

asp.net-core entity-framework-6 entity-framework-core

以下是ASP.NET Core和Entity Framework 6入門的摘錄:

“在ASP.NET Core 1.0應用程序中使用Entity Framework 6的推薦方法是將EF6上下文和模型類放在面向完整框架的類庫項目(.csproj項目文件)中。添加對類庫的引用來自ASP.NET核心項目。“

我的目標:在n層解決方案中並行實現EntityFramework 6和EntityFramework Core。

解:

  • 具有單個用戶帳戶身份驗證的ASP.NET核心Web應用程序(.NET Framework)
  • 包含BLL和DAL的Windows類庫(.dll)

並排實施EF 6和EF Core的原因是:

  • EF Core 1.x實施問題(遷移,多對零關係)
  • ASP.NET Core中的單個用戶帳戶身份驗證依賴於Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext
  • 此用例將實現當前依賴於Entity Framework 6的BreezeJS

我可以成功地將遷移添加到ASP.NET Core Web Application,如下所示:

PM> EntityFrameworkCore\Add-Migration InitialCreate

但是,在嘗試將遷移添加到Windows類庫時出現異常:

PM> EntityFramework\Add-Migration InitialCreate

使用“2”參數調用“SetData”的異常:“在程序集中鍵入'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject',Microsoft.VisualStudio.ProjectSystem.VS.Implementation,Version = 14.1。 0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'未標記為可序列化。“在C:\ Src \ Hcs.NetCore \ packages \ EntityFramework.6.1.3 \ tools \ EntityFramework.psm1:720 char:5 + $ domain.SetData('startUpProject',$ startUpProject)...

如果我卸載ASP.NET核心Web應用程序,那麼我可以使用以下步驟成功將EF6遷移添加到Windows類庫:

PM> EntityFramework\enable-migrations
PM> EntityFramework\add-migration InitialCreate

現在我在兩個項目中都進行了初始遷移。

但是,當我運行ASP.NET核心Web應用程序時,我得到了幾個運行時異常:

如果我在System.Data.Entity.DbContext的自定義實現中有無參數構造函數,那麼我得到以下運行時異常:

System.Data.SqlClient.SqlException未被用戶代碼處理 -
Message =建立與SQL Server的連接時發生與網絡相關或特定於實例的錯誤。服務器未找到或無法訪問。驗證實例名稱是否正確,以及SQL Server是否配置為允許遠程連接。 (提供程序:SQL網絡接口,錯誤:26 - 查找指定的服務器/實例時出錯) -

通過刪除默認構造函數來解決這個問題。

當我嘗試註冊用戶時,拋出以下異常:

System.Data.SqlClient.SqlException(0x80131904):無法打開登錄請求的數據庫“xxx”。登錄失敗。用戶yyy \ zzz'登錄失敗。在System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity標識,SqlConnectionString connectionOptions,SqlCredential憑證,Object providerInfo,String newPassword,SecureString newSecurePassword,Boolean redirectedUserInstance,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,DbConnectionPool pool,String accessToken,Boolean applyTransientFaultHandling)at

問:我走在正確的軌道上嗎?這現在只是一個SQL Server身份驗證問題嗎?或者,還涉及其他問題嗎?

一般承認的答案

“使用”2“參數異常調用”SetData“的異常:â€

“Exception calling "SetData" with "2" argument(s) exception:â€可以通過在以下命令中傳遞-StartupProject-StartupProjectName參數來解決:

在Package Manager Console中,將Default Project設置為包含EF6上下文的類庫(在我的例子中為Dna.Net.Application.DAL.EF6)並執行:

PM> EntityFramework\enable-migrations -StartupProject Dna.Net.App.DAL.EF6
PM> EntityFramework\add-migration InitialCreate -StartupProjectName Dna.Net.App.DAL.EF6

“System.Data.SqlClient.SqlException(0x80131904):無法打開登錄請求的數據庫”xxx“。登錄失敗。

“System.Data.SqlClient.SqlException (0x80131904): Cannot open database "xxx†requested by the login. The login failed.â€例外可以通過在保存新用戶時單擊[Apply Migrations]按鈕來解決帳戶, 或者 ,在設計時通過執行Update-Database ,如下所示:

在Package Manager Console中,將Default Project設置為包含EF6上下文的類庫並執行:

PM> EntityFramework\Update-Database -StartupProject Dna.Net.Application.DAL.EF6

在Package Manager Console中,將Default Project設置為包含EF Core上下文的類庫並執行:

PM> EntityFrameworkCore\Update-Database

此時,我可以使用服務器資源管理器或SQL Server對象資源管理器檢查數據庫。

Update-Database命令為EFCore和EF6上下文創建了唯一的數據庫。

此解決方案遵循ASP.NET核心和實體框架6入門的“示例應用程序”部分中包含的準則,但有以下例外:

  • 我不需要實現IDbContextFactory

現在我可以成功執行以下測試:

  • 通過ASP.NET Core MVC個人用戶帳戶腳手架添加用戶。
  • 修改(ASP.NET Core MVC scaffolded)HomeController.About()以將自定義實體持久化並檢索到自定義System.Data.Entity.DbContext實現。
  • 修改About.cshtml以顯示持久化的自定義實體。

熱門答案

EF6命令不知道如何使用ASP.NET Core項目(它們在編寫時不存在)。在運行EF6命令之前,您可能必須卸載這些項目。

您也可以明確指定-StartupProject作為EF6項目來解決該問題。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow