具有類庫和 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 問題

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);
        }
    }