具有类库和 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) - 如果不是从这里下载 [](https://www.microsoft.com/net)

如果你在安装 .NET Core 时遇到问题(错误类似于 Visual Studio 2015 Update 3 未正确安装) - 你可以使用以下命令运行安装:[DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1] - 这将阻止安装执行 Visual Studio 检查 Github 问题

StackOverflow 文档

第 2 步 - 创建项目

创建一个新的 ASP.NET 核心 Web 应用程序 - >然后在下一个屏幕中选择 Web 应用程序

StackOverflow 文档

添加 Class Library (.NET Core) 项目

StackOverflow 文档

第 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 下的包

StackOverflow 文档

- - - - - - - - 要么

你可以使用 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

这将为你提供有关启动项目的错误:

StackOverflow 文档

为此,你必须将添加到类库中的相同引用添加到 .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 的样子

StackOverflow 文档

然后再次在 Package Manager Console 中针对类库运行命令:

如果你尚未将类库的引用添加到 Web App,则会收到以下错误:

StackOverflow 文档

要解决此问题,请将类库的引用添加到 Web App:

StackOverflow 文档

最后

再次运行命令 - 在 Package Manager Console 中:

Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

这应该在类库中的 Models 文件夹下创建实体

StackOverflow 文档

传递连接字符串

在我的例子中,我们有一个多租户应用程序,其中每个客户端都有自己的数据库,例如 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);
        }
    }