一.前言
Entity Framework(后面簡稱EF)作為微軟家的ORM,自然而然從.NET Framework延續到了.NET Core。以前我也嫌棄EF太重而不去使用它,但是EF Core(Entity Framework Core)已經做了很多性能優化,還有一些增加新特性,吸引了我去使用它。關於EF Core 2.0 的新特性請看:http://www.cnblogs.com/stulzq/p/7366044.html
二.控制台程序使用 EF Core(Code First)
1.新建一個.NET Core控制台程序
2.通過Nuget安裝 EF Core
-
Sql Server 請安裝
Microsoft.EntityFrameworkCore.SqlServer
-
MySql/MariaDB請安裝
Pomelo.EntityFrameworkCore.MySql
(2.0及以上版本)
MySql/MariaDB 推薦使用Pomelo EF Core組件,因為官方的目前可能存在bug,Pomelo EF Core同樣是微軟官方所推薦的。
其他數據庫請查看:https://docs.microsoft.com/zh-cn/ef/core/providers/
安裝好EF Core之后,打開項目*.csproj文件 添加如下代碼。
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>
本文所用數據庫為MariaDB
3.添加實體
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
4.添加數據庫上下文
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//配置mariadb連接字符串
optionsBuilder.UseMySql("Server=localhost;Port=3306;Database=BloggingDB; User=root;Password=;");
}
}
5.使用
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
db.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
var count = db.SaveChanges();
Console.WriteLine("{0} records saved to database", count);
Console.WriteLine();
Console.WriteLine("All blogs in database:");
foreach (var blog in db.Blogs)
{
Console.WriteLine(" - {0}", blog.Url);
}
}
Console.ReadKey();
}
現在F5運行,肯定會出異常的,因為我們需要使用的數據庫並不存在,EF Core默認的創建數據庫策略已經和EF不用,請看后面的遷移操作
三.ASP.NET Core 使用 EF Core(Code First)
1.創建一個asp.net core 2.0 mvc項目
2.通過Nuget安裝 EF Core(同上)
3.添加實體(同上)
4.添加數據庫上下文
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
5.配置EF Core
在Startup添加如下代碼:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContextPool<BloggingContext>(options => options.UseMySql("Server=localhost;Port=3306;Database=WebBloggingDB; User=root;Password=;")); //配置mariadb連接字符串
}
6.在Controller中獲取數據庫上下文。
這里我們利用ASP.NET Core的依賴注入來獲取數據庫上下文。
private readonly BloggingContext _context;
public BlogsController(BloggingContext context)
{
_context = context;
}
四.EF Core的遷移操作
前面說過,EF Core默認的創建數據庫策略已經和EF不用,需要我們通過遷移來創建數據庫
這里不論是控制台還是ASP.NET Core操作都是一樣的,這里以ASP.NET Core作為示例。
1.將ASP.NET Core項目設為啟動項目
2.打開程序包管理器控制台
,並選擇對應的項目
3.執行添加遷移命令 Add-Migration init
4.遷移成功可以看見在項目根目錄下添加了一個Migrations文件夾
5.更新遷移到數據庫,執行命令 Update-Database
這時我們的數據庫已經被創建!
現在就可以正常運行控制台或者ASP.NET Core程序了!
五.EF Core遷移更新到生產環境
EF Core將遷移更新到生產環境可以使用Script-Migration
命令生成sql腳本,然后到生產數據庫執行
語法 Script-Migration [-From] <String> [-To] <String> [-Idempotent] [-Output <String>] [-Context <String>] [-Project <String>] [-StartupProject <String>] [<CommonParameters>]
示例:Script-Migration -From 20171023035934_v113 -To 20171024035934_V114
上面的命令會生成113版本遷移到114版本的SQL語句
生成SQL語句如下圖:
還有一種方法就是通過代碼進行自動遷移,這里暫時不做敘述,后面的文章會詳細介紹。
六. EF Core 的 DB First
前面所介紹的都是Code First,這里介紹一下DB First,大型項目推薦使用DB First。
1.創建數據庫(Sql Server)
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
2.新建一個.NET Core控制台程序
3.通過Nuget添加EF
-
運行
Install-Package Microsoft.EntityFrameworkCore.SqlServer
-
運行
Install-Package Microsoft.EntityFrameworkCore.Tools
(EF工具包,創建實體)
4.執行下面的命令創建實體
Scaffold-DbContext "Data Source=.;Initial Catalog=Blogging;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
命令格式為:
Scaffold-DbContext "數據庫連接字符串" EF組件名(Microsoft.EntityFrameworkCore.SqlServer/Pomelo.EntityFrameworkCore.MySql/等等) -OutputDir 輸出文件夾名稱
然后查看項目目錄,可以看到一件多了一個Models文件夾,下面有創建的實體和數據庫上下文。
ASP.NET Core項目操作是一樣的。