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
- Microsoft.EntityFrameworkCore.SqlServer
(2.0及以上版本)
- Pomelo.EntityFrameworkCore.MySql
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
- 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添加如下代码:
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddDbContextPool<BloggingContext>(options => options.UseMySql("Server=localhost;Port=3306;Database=webBloggingDB; User=root;Password=;")); //配置mariadb连接字符串
- }
这里我们利用ASP.NET Core的依赖注入来获取数据库上下文。
- 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将迁移更新到生产环境可以使用
命令生成sql脚本,然后到生产数据库执行
- Script-Migration
语法
- 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
(EF工具包,创建实体)
- Install-Package Microsoft.EntityFrameworkCore.Tools
- 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项目操作是一样的。
来源: http://www.cnblogs.com/stulzq/p/7717873.html