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.htmlhtml
Sql Server 请安装 Microsoft.EntityFrameworkCore.SqlServer
git
MySql/MariaDB请安装 Pomelo.EntityFrameworkCore.MySql
(2.0及以上版本)github
MySql/MariaDB 推荐使用Pomelo EF Core组件,由于官方的目前可能存在bug,Pomelo EF Core一样是微软官方所推荐的。web
其余数据库请查看:https://docs.microsoft.com/zh-cn/ef/core/providers/sql
安装好EF Core以后,打开项目*.csproj文件 添加以下代码。shell
<ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> </ItemGroup>
本文所用数据库为MariaDB数据库
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; } }
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=;"); } }
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不用,请看后面的迁移操做性能优化
public class BloggingContext : DbContext { public BloggingContext(DbContextOptions<BloggingContext> options) : base(options) { } public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } }
在Startup添加以下代码:mvc
public void ConfigureServices(IServiceCollection services) { services.AddDbContextPool<BloggingContext>(options => options.UseMySql("Server=localhost;Port=3306;Database=WebBloggingDB; User=root;Password=;")); //配置mariadb链接字符串 }
这里咱们利用ASP.NET Core的依赖注入来获取数据库上下文。asp.net
private readonly BloggingContext _context; public BlogsController(BloggingContext context) { _context = context; }
前面说过,EF Core默认的建立数据库策略已经和EF不用,须要咱们经过迁移来建立数据库
这里不管是控制台仍是ASP.NET Core操做都是同样的,这里以ASP.NET Core做为示例。
程序包管理器控制台
,并选择对应的项目Add-Migration init
Update-Database
这时咱们的数据库已经被建立!
如今就能够正常运行控制台或者ASP.NET 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语句以下图:
还有一种方法就是经过代码进行自动迁移,这里暂时不作叙述,后面的文章会详细介绍。
前面所介绍的都是Code First,这里介绍一下DB First,大型项目推荐使用DB First。
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
运行 Install-Package Microsoft.EntityFrameworkCore.SqlServer
运行 Install-Package Microsoft.EntityFrameworkCore.Tools
(EF工具包,建立实体)
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项目操做是同样的。