在本教程中,你將使用 Entity Framework Core 構(gòu)建執(zhí)行基本數(shù)據(jù)訪問的 ASP.NET Core MVC 應(yīng)用程序。 要對現(xiàn)有數(shù)據(jù)庫進行反向工程,以創(chuàng)建 Entity Framework 模型。
安裝以下軟件:
本教程使用 LocalDb 實例上的博客數(shù)據(jù)庫作為現(xiàn)有數(shù)據(jù)庫。 如果已在其他教程中創(chuàng)建了博客數(shù)據(jù)庫,請?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
要安裝 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 模型了。
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)系注入的概念是 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)系注入。
若要使 BloggingContext 對 MVC 控制器可用,請將其注冊為服務(wù)。
C#
using EFGetStarted.AspNetCore.ExistingDb.Models;
using Microsoft.EntityFrameworkCore;
現(xiàn)在,可以使用 AddDbContext(...) 方法將其注冊為服務(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)詳細信息,請參閱連接字符串。
現(xiàn)在可以運行應(yīng)用程序來查看其實際運行情況。
更多建議: