一、 reverse engineer(database->code)
In Visual Studio, select menu Tools -> NuGet Package Manger -> Package Manger Console and run the following command:
PM>Scaffold-DbContext "Server=.\SQLExpress;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
需要安装包Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.EntityFrameworkCore.Tools
使用Scaffold-DbContext命令需要项目中安装 Microsoft.EntityFrameworkCore.Design 和 Microsoft.EntityFrameworkCore.SqlServer 包,如果是MySQL的话则安装 Pomelo.EntityFrameworkCore.MySql
二、 Code first migration
1在vs中创建项目
引入包Microsoft.EntityFrameworkCore
根据需要引入数据库的provider包,如sqlserver为Microsoft.EntityFrameworkCore.SqlServer,mysql为Pomelo.EntityFrameworkCore.MySql
,sqlite为Microsoft.EntityFrameworkCore.Sqlite。
2 创建表实体:
public class Book
{
public int BookId { get; set; }
public string Title { get; set; }
}
3 创建数据库的Dbcontext
比如
public class BookContext:DbContext
{
public BookContext()
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Server=.;Database=bookstest;Trusted_Connection=True;");
}
}
}
指定数据库Dbcontext的数据库类型和连接字符串有三种方法,一种就是上面的,写一个没有参数的构造函数,然后通过 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
指定数据库的provider和连接串。
如果启动项目使用 ASP.NET Core Web Host或者.NET Core Generic Host,系统工具将会从serviceprovider得到DbContext
public class Program
{
public static void Main(string[] args)
=> CreateHostBuilder(args).Build().Run();
// EF Core uses this method at design time to access the DbContext public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults( webBuilder => webBuilder.UseStartup<Startup>());
}
public class Startup
{
// public void ConfigureServices(IServiceCollection services)
// => services.AddDbContext();
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<ApplicationDbContext>( options => options.UseSqlServer("name=ConnectionStrings:DefaultConnection"));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { }
}
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options)
: base(options)
{
}
}
这种方法需要把DbContext注册成为服务。
还有一种方法就是使用设计时工厂
public class BloggingContextFactory : IDesignTimeDbContextFactory
{
public BloggingContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder
optionsBuilder.UseSqlite("Data Source=blog.db");
return new BloggingContext(optionsBuilder.Options); }
}
设计工厂的优先级最高。
三、生成数据库
将实体类加入dbcontext类
public class BookContext:DbContext
{
public BookContext()
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Server=.;Database=bookstest;Trusted_Connection=True;");
}
}
public DbSet<Book> Books { get; set;
}
在vs中,设定好启动项目,启动项目为Host项目(如果是host设定的)或者含有设计工厂类的项目。
在Package manager console 中,设定默认项目为含有dbcontext 的项目
使用add-migration 和update-database 将表更新到数据库。