以前使用db.Database.EnsureCreatedAsync()創建數據庫,這樣創建的數據庫無法更新,無法遷移,當數據庫作出修改后就會因為兼容舊版而束手無策,只能重新錄入數據。基於這種需求,研究了EF提供的Migrations功能。
vs版本:2015,.NetCore版本:1.0.1。
新建項目ConsoleApp1。
想要使用Migrations,需先安裝EF命令行工具:Microsoft.EntityFrameworkCore.Tools,不知道什么時候,此包被包含到“Microsoft.EntityFrameworkCore.Tools.DotNet”中:
"tools": { "Microsoft.EntityFrameworkCore.Tools.DotNet": { "version": "1.0.0-preview3-final" }
注:經調查,此包版本須為“1.0.0-preview3-final”,否則各種失敗。
其他需要引用的包有:
"Microsoft.EntityFrameworkCore.Design": { "version": "1.0.1", "type": "build" }, "System.Reflection.TypeExtensions": "4.3.0-*", "Microsoft.EntityFrameworkCore": "1.0.1-*",
注:Microsoft.EntityFrameworkCore.Design的版本不可低於1.0.0-preview3-final,不可高於1.0.1。
接下來可以安裝工具了,在ConsoleApp1解決方案根目錄使用命令:
dotnet restore
cd src\\ConsoleApp1
dotnet ef
成功后命令行顯示:
此時已可使用EF命令行了。
現在創建Model:
public class Blog { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string Url { get; set; } } public class Post { public virtual int Id { get; set; } public virtual string Title { get; set; } public virtual string Content { get; set; } public virtual int BlogId { get; set; } public virtual Blog Blog { get; set; } }
創建數據上下文:
public class EFCoreContext : DbContext {public DbSet<Blog> Blog { get; set; } public DbSet<Post> Post { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("data source=consoledemo.sdb"); } }
在工程所在目錄使用命令:
此時輸出目錄中已生成了數據庫文件,並自動創建了兩個表Blog和Post。
添加數據:
var blog = new Blog { Id = 11, Name = "myblog", Url = "http://www.cnblogs.com/automan-wei/" }; db.Blog.Add(blog); db.SaveChanges();
顯然是成功的。
現在使用數據庫遷移。
修改Blog類,添加一個屬性:
public class Blog { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string Url { get; set; } public virtual string Auther { get; set; } }
需要先添加一個遷移,再更新數據庫:
可以看到,項目中已多出一個遷移文件:
數據庫也已被更新:
關於EF7的數據庫遷移功能,暫時就到這兒了。