具有類庫和 SQL Server 的實體框架核心中的資料庫優先
好吧,我花了大約一天的時間才弄明白所以我在這裡釋出了我遵循的步驟,以便讓我的資料庫首先在帶有 .NET Core Web App 的 Class Project (.NET Core)
中工作。
第 1 步 - 安裝 .NET Core
確保你使用的是 .NET Core 而不是 DNX (Hint: You should be able to see the .NET Core option when creating a New Project)
- 如果不是從這裡下載
如果你在安裝 .NET Core 時遇到問題(錯誤類似於 Visual Studio 2015 Update 3 未正確安裝) - 你可以使用以下命令執行安裝:[DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1
] - 這將阻止安裝執行 Visual Studio 檢查 Github 問題
第 2 步 - 建立專案
建立一個新的 ASP.NET 核心 Web 應用程式 - >然後在下一個螢幕中選擇 Web 應用程式
新增 Class Library (.NET Core)
專案
第 3 步 - 安裝 EF 包
開啟類庫的 project.json
檔案,貼上以下內容,然後儲存檔案:
{
"version": "1.0.0-*",
"dependencies": {
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
"NETStandard.Library": "1.6.0"
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
},
"frameworks": {
"net46": {
},
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-*"
}
}
}
}
}
這應該恢復 References
下的包
- - - - - - - - 要麼
你可以使用 Nuget Package Manager 通過在程式包管理器控制檯中執行以下命令來安裝它們
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools –Pre
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design
注意:一次安裝一個包 - 如果安裝後出錯
Microsoft.EntityFrameworkCore.Tools
然後將 project.json
框架部分的內容更改為:
"frameworks": {
"net46": {
},
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-*"
}
}
}
}
第 4 步 - 建立資料庫模型
現在要生成資料庫,請在 Package Manager Console
中執行以下命令(不要忘記將連線字串更改為資料庫)
Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer
這將為你提供有關啟動專案的錯誤:
為此,你必須將新增到類庫中的相同引用新增到 .NET Web App
所以開啟你的 project.json
for Web App,
在 dependencies
下,新增:
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
並在 tools
下新增:
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
進行更改後儲存檔案。
這就是我的 project.json 的樣子
然後再次在 Package Manager Console 中針對類庫執行命令:
如果你尚未將類庫的引用新增到 Web App,則會收到以下錯誤:
要解決此問題,請將類庫的引用新增到 Web App:
最後
再次執行命令 - 在 Package Manager Console
中:
Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
這應該在類庫中的 Models 資料夾下建立實體
傳遞連線字串
在我的例子中,我們有一個多租戶應用程式,其中每個客戶端都有自己的資料庫,例如 Client_1,Client_2,Client_3。所以連線字串必須是動態的。
所以我們將一個連線字串屬性新增到建構函式中,並將其傳遞給 OnConfiguring
方法中的 Context
public partial class ClientContext
{
private readonly string _connectionString;
public ClientContext(string connectionString) : base()
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_connectionString);
}
}
並像這樣使用它:
public void TestConnection()
{
var clientId = 1;
var connectionString = string.Format("Server=192.168.0.211; Database=Client_{0}; user id= USER; password = PWD;", clientId);
using (var clientContext = new ClientContext(connectionString))
{
var assets = clientContext.Users.Where(s => s.UserId == 1);
}
}