通過現(xiàn)有數(shù)據(jù)庫在 ASP.NET Core 上開始使用 EF Core

2019-04-17 08:58 更新

在本教程中,你將使用 Entity Framework Core 構(gòu)建執(zhí)行基本數(shù)據(jù)訪問的 ASP.NET Core MVC 應(yīng)用程序。 要對現(xiàn)有數(shù)據(jù)庫進行反向工程,以創(chuàng)建 Entity Framework 模型。

在 GitHub 上查看此文章的示例。

系統(tǒng)必備

安裝以下軟件:

  • 具有以下工作負載的 Visual Studio 2017 15.7:“ASP.NET 和 Web 開發(fā)”(位于“Web 和云”下)“.NET Core 跨平臺開發(fā)”(位于“其他工具集”下)
  • .NET Core 2.1 SDK.

創(chuàng)建博客數(shù)據(jù)庫

本教程使用 LocalDb 實例上的博客數(shù)據(jù)庫作為現(xiàn)有數(shù)據(jù)庫。 如果已在其他教程中創(chuàng)建了博客數(shù)據(jù)庫,請?zhí)^這些步驟。

  • 打開 Visual Studio
  • “工具”->“連接到數(shù)據(jù)庫...”
  • 選擇“Microsoft SQL Server”,然后單擊“繼續(xù)”
  • 輸入“(localdb)\mssqllocaldb”作為服務(wù)器名稱
  • 輸入“master”作為數(shù)據(jù)庫名稱,然后單擊“確定”
  • Master 數(shù)據(jù)庫現(xiàn)在顯示在“服務(wù)器資源管理器”的“數(shù)據(jù)連接”中
  • 右鍵單擊“服務(wù)器資源管理器”中的數(shù)據(jù)庫,然后選擇“新建查詢”
  • 將下列腳本復(fù)制到查詢編輯器中
  • 右鍵單擊查詢編輯器,然后選擇“執(zhí)行”

SQL

CREATE DATABASE [Blogging];
GO

USE [Blogging];
GO

CREATE TABLE [Blog] (
    [BlogId] int NOT NULL IDENTITY,
    [Url] nvarchar(max) NOT NULL,
    CONSTRAINT [PK_Blog] PRIMARY KEY ([BlogId])
);
GO

CREATE TABLE [Post] (
    [PostId] int NOT NULL IDENTITY,
    [BlogId] int NOT NULL,
    [Content] nvarchar(max),
    [Title] nvarchar(max),
    CONSTRAINT [PK_Post] PRIMARY KEY ([PostId]),
    CONSTRAINT [FK_Post_Blog_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blog] ([BlogId]) ON DELETE CASCADE
);
GO

INSERT INTO [Blog] (Url) VALUES
('http://blogs.msdn.com/dotnet'),
('http://blogs.msdn.com/webdev'),
('http://blogs.msdn.com/visualstudio')
GO

創(chuàng)建新項目

  • 打開 Visual Studio 2017
  • “文件”>“新建”>“項目...”
  • 從左菜單中選擇“已安裝”>“Visual C#”>“Web”。
  • 選擇“ASP.NET Core Web 應(yīng)用程序”項目模板
  • 輸入 EFGetStarted.AspNetCore.ExistingDb 作為名稱(它必須完全匹配稍后在代碼中使用的命名空間),再單擊“確定”
  • 等待“新建 ASP.NET Core Web 應(yīng)用程序”對話框顯示出來
  • 確保目標(biāo)框架下拉列表設(shè)置為 .NET Core,版本下拉列表設(shè)置為 ASP.NET Core 2.1
  • 選擇“Web 應(yīng)用程序(模型視圖控制器)”模板
  • 確保將“身份驗證”設(shè)置為“無身份驗證”
  • 單擊“確定”

安裝 Entity Framework Core

要安裝 EF Core,請為要作為目標(biāo)對象的 EF Core 數(shù)據(jù)庫提供程序安裝程序包。 有關(guān)可用提供程序的列表,請參閱數(shù)據(jù)庫提供程序。

對于本教程,無需安裝提供程序包,因為本教程使用 SQL Server。 SQL Server 提供程序包包含在 Microsoft.AspnetCore.App 元包中。

對模型實施反向工程

現(xiàn)在是時候基于現(xiàn)有數(shù)據(jù)庫創(chuàng)建 EF 模型了。

  • “工具”–>“NuGet 包管理器”–>“包管理器控制臺”
  • 運行以下命令以從現(xiàn)有數(shù)據(jù)庫創(chuàng)建模型:

PowerShell

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

如果收到錯誤,指出 The term 'Scaffold-DbContext' is not recognized as the name of a cmdlet,請關(guān)閉并重新打開 Visual Studio。

 提示

可以通過將 -Tables 參數(shù)添加到上述命令來指定要為哪些表生成實體。 例如 -Tables Blog,Post。

反向工程過程基于現(xiàn)有數(shù)據(jù)庫的架構(gòu)創(chuàng)建實體類 (Blog.cs & Post.cs) 和派生上下文 (BloggingContext.cs)。

實體類是簡單的 C# 對象,代表要查詢和保存的數(shù)據(jù)。 以下是 Blog 和 Post 實體類:

C#

using System;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.ExistingDb.Models
{
    public partial class Blog
    {
        public Blog()
        {
            Post = new HashSet<Post>();
        }

        public int BlogId { get; set; }
        public string Url { get; set; }

        public ICollection<Post> Post { get; set; }
    }
}

C#

using System;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.ExistingDb.Models
{
    public partial class Post
    {
        public int PostId { get; set; }
        public int BlogId { get; set; }
        public string Content { get; set; }
        public string Title { get; set; }

        public Blog Blog { get; set; }
    }
}

 提示

若要啟用延遲加載,可以創(chuàng)建導(dǎo)航屬性 virtual(Blog.Post 和 Post.Blog)。

上下文表示與數(shù)據(jù)庫的會話,并允許查詢和保存實體類的實例。

C#

public partial class BloggingContext : DbContext
{
   public BloggingContext()
   {
   }

   public BloggingContext(DbContextOptions<BloggingContext> options)
       : base(options)
   {
   }

   public virtual DbSet<Blog> Blog { get; set; }
   public virtual DbSet<Post> Post { get; set; }

   protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
       if (!optionsBuilder.IsConfigured)
       {
           #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
           optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;");
       }
   }

   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
       modelBuilder.Entity<Blog>(entity =>
       {
           entity.Property(e => e.Url).IsRequired();
       });

       modelBuilder.Entity<Post>(entity =>
       {
           entity.HasOne(d => d.Blog)
               .WithMany(p => p.Post)
               .HasForeignKey(d => d.BlogId);
       });
   }
}

通過依賴關(guān)系注入注冊上下文

依賴關(guān)系注入的概念是 ASP.NET Core 的核心。 服務(wù)(例如 BloggingContext)在應(yīng)用程序啟動期間通過依賴關(guān)系注入進行注冊。 然后,通過構(gòu)造函數(shù)參數(shù)或?qū)傩詾樾枰@些服務(wù)的組件(如 MVC 控制器)提供相應(yīng)服務(wù)。 有關(guān)依賴關(guān)系注入的詳細信息,請參閱 ASP.NET 網(wǎng)站上的文章依賴關(guān)系注入。

在 Startup.cs 中注冊并配置上下文

若要使 BloggingContext 對 MVC 控制器可用,請將其注冊為服務(wù)。

  • 打開 Startup.cs
  • 在文件開頭添加以下 using 語句

C#

using EFGetStarted.AspNetCore.ExistingDb.Models;
using Microsoft.EntityFrameworkCore;

現(xiàn)在,可以使用 AddDbContext(...) 方法將其注冊為服務(wù)。

  • 找到 ConfigureServices(...) 方法
  • 添加以下突出顯示的代碼以將上下文注冊為服務(wù)

C#

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    var connection = @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;ConnectRetryCount=0";
    services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));
}

 提示

在實際的應(yīng)用程序中,通常會將連接字符串置于配置文件或環(huán)境變量中。 為簡單起見,本教程要你在代碼中定義它。 有關(guān)詳細信息,請參閱連接字符串。

創(chuàng)建控制器和視圖

  • 在“解決方案資源管理器”中,右鍵單擊“控制器”文件夾,然后選擇“添加”->“控制器...”
  • 選擇“視圖使用 Entity Framework 的 MVC 控制器”,然后單擊“確定”
  • 將“模型類”設(shè)置為“Blog”,將“數(shù)據(jù)上下文類”設(shè)置為“BloggingContext”
  • 單擊“添加”

運行此應(yīng)用程序

現(xiàn)在可以運行應(yīng)用程序來查看其實際運行情況。

  • “調(diào)試”->“開始執(zhí)行(不調(diào)試)”
  • 應(yīng)用程序?qū)⑸刹⒃?Web 瀏覽器中打開
  • 導(dǎo)航到 /Blogs
  • 單擊“新建”
  • 輸入新博客的 Url,然后單擊“創(chuàng)建”創(chuàng)建頁面索引頁


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號