数据迁移:
现在项目中有 一个自己的 DbContext 和一些模型类,我们想利用 EF Core框架为我们在数据库所在服务器上自动创建数据库或在已存在的数据库上创建新的表。首先的确保电脑上安装了Sqlserver数据库。
如下:
public class MyContext : DbContext
{
public MyContext(DbContextOptions<MyContext> options)
: base(options)
{ }
public DbSet<MyBlog> MyBlog { get; set; }
public DbSet<MyPost> MyPost { get; set; }
}
public class MyBlog
{
public int BlogId { get; set; }
public string Url { get; set; }
public ICollection<Post> Posts { get; set; }
}
public class MyPost
{
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; }
}
然后在StartUp.cs类中的ConfigureService()中,使用数据迁移时需用到的 connecString.,数据库连接字符串。
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
//MyNewDb 为新的数据库名字,或已存在的数据库的名字
//localDb
var connection = @"Server=(localdb)\mssqllocaldb;Database=MyNewDb;Trusted_Connection=True;ConnectRetryCount=0";
//sqlserver
//var connection = @"Server=LIUYAN6678\SQL2008;Database=MyNewDb;Trusted_Connection=True;ConnectRetryCount=0 ";
services.AddDbContext<MyContext>(options => options.UseSqlServer(connection));
}
打开VS的 程序包管理控制器台。
先执行:
有EntityFrameworkCore\的原因是不想与EF6冲突。
有-Context MyContext 是万一程序中有多个DbContext,怕冲突
1.
PM> EntityFrameworkCore\Add-Migration 迁移操作记录(随便写) -Context MyContext
再执行:
2.
PM> EntityFrameworkCore\update-database -Context MyContext
如果报错,如没有主键,则需在对应字段加[Key]。
迁移操作记录不能重复。否则update-database无效。
之后再去你的数据库所在服务器上查看,会发现多了 MyNewDb这个数据库,且里面有与模型对应的表。
每次加了模型,需更新数据库的表,需要重新执行上面的2句命令。
逆向工程:
假如数据库和表已经存在了,我们在项目中不想自己创建模型,可以通过逆向工程来生成对应的模型类。
需先在项目引用两个Nuget包:
1.Microsoft.EntityFrameworkCore.Design
2.Microsoft.EntityFrameworkCore.SqlServer
打开VS的 程序包管理控制台。
//Server为数据库所在服务器
//Database为数据库名称
//-OutputDir 指定表模型生成所在文件夹,MVC项目必须默认为Models文件夹,类库项目可任意取名且可多层路径(文件夹/文件夹/文件夹)
//-Tables MyBlog,MyPost 参数指定表名生成模型,不指定,则生成所有表模型。
//-Context SelfDbContext 指定DbContext的名称,默认为数据库名加Context
执行以下任一一个命令 即可对数据库进行逆向工程
PM> Scaffold-DbContext "数据库连接字符串"
Microsoft.EntityFrameworkCore.SqlServer -OutputDir SQLModels
1、
PM> Scaffold-DbContext "Server=LIUYAN6678\SQL2008;Database=MyNewDb;Trusted_Connection=True;"
Microsoft.EntityFrameworkCore.SqlServer -OutputDir SQLModels
2、
PM> Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;"
Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
3、
PM> Scaffold-DbContext "Server=LIUYAN6678\SQL2008;Database=MyNewDb;Trusted_Connection=True;"
Microsoft.EntityFrameworkCore.SqlServer -Tables MyBlog,MyPost -Context SelfDbContext -OutputDir OtherMyNewDb/Two/One/other
3、
//远程逆向工程使用账号密码的连接字符串
PM> Scaffold-DbContext "Data Source=LIUYAN6678\SQL2008;Initial Catalog=MyNewDb;User ID=***;Password=***;ConnectTimeout=30;Encrypt=False;TrustServerCertificate=true;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" Microsoft.EntityFrameworkCore.SqlServer -Tables MyBlog -OutputDir OtherMyNewDb/Two/One/other
注意事项:
如果生成的文件已存在,存在同名,则在上面命令的最后加 -Force
程序包管理控制台和当前项目都必须设置为操作的项目,否则默认为第一个项目会造成逆向工程失败。
MVC项目中的Models文件夹必须默认,否则会在执行逆向工程命令时出错。
对类库项目,Models文件夹可自定义,无需默认。
默认对数据库下所有表生成模型,如需指定表用 -Tables t1,t2,t3类似命令指定表名。
指定数据库对象上下文对象名称需用 -Context Name 默认为数据名加Context。
如果命令行报错,则需为项目添加指定的EF Core包的引用。