具有类库和 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);
}
}