Core
Asp.net Core 由於依賴注入的廣泛使用,配置資料移轉,與Asp.net大不相同,本篇介紹一下Asp.net Core添加資料移轉的過程
添加Nuget包
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.EntityFrameworkCore.Design
首先建立一個 Model 類 User:
public class User { //使用者編號(自增長主鍵) [Key] public long UserId { get; set; } //使用者名稱(必填項) [MaxLength(30),Required] public string UserName { get; set; } //密碼(必填項) [MaxLength(16),DataType(DataType.Password),Required] public string Password { get; set; } }
然後建立MyDbContext類
public class BlogDbContext:DbContext { //由於依賴注入的關係,不加建構函式這裡會出現警告,但不影響資料移轉檔案的建立,更新資料庫也沒影響 public BlogDbContext(DbContextOptions<BlogDbContext> options):base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder builder) { //添加資料庫連接字串 builder.UseSqlServer(@"Server=.;User id=sa;Password=123;Database=BlogDbContext"); } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); //添加FluentAPI配置 var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(q => q.GetInterface(typeof(IEntityTypeConfiguration<>).FullName) != null); foreach(var type in typesToRegister) { dynamic configurationInstance = Activator.CreateInstance(type); builder.ApplyConfiguration(configurationInstance); } } //User相關表 public DbSet<User> Users { get; set; } }
然後配置AppSetting.json,添加資料庫連接字串:
"ConnectionStrings": { "DefaultConnection": "Server=.;User Id=sa;Password=123;Database=BlogDbContext;" },
在Startup.cs檔案中注入資料庫服務:
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<BlogDbContext>(options => options.UseSqlServer("DefaultConnection")); services.AddMvc(); }
然後就可以進行資料移轉了,由於Asp .net Core 預設開啟資料移轉,所以直接添加資料移轉就可以了
Add-Migration Init
下面添加種子資料,這裡不得不說踩過的一個大坑,添加種子資料的時候不僅與EF6.0 大不相同,跟EF Core1.X也大相徑庭,也怪自己,不去看官方文檔,非要去找教程(目前網上大部分教程都是1.x),哎,說多了都是淚。
有大佬指出,這裡用的方法不是種子,去看了看官方文檔,EF Core中並沒有Seed方法,所以這裡時添加測試資料,並不是種子。
添加一個初始化資料類,命名為SeedData.cs
public static class SeedData { /// <summary> /// /// 配置測試資料 /// /// </summary> public static void Initialize(IServiceProvider app) { var _dbContext= app.GetRequiredService<BlogDbContext>(); //如果已經有資料就直接返回 if(_dbContext.Users.Any()) { return; } //添加User測試資料 _dbContext.Users.Add(new User { UserName = "Niko", Password = "123" }); _dbContext.SaveChanges(); } }
與EF Core 1.x不同的是,2.0是在Program.cs裡的Main方法裡(1.x是在Startup.cs中的Configure方法中)添加初始化方法。修改Main方法為:
public static void Main(string[] args) { var host = BuildWebHost(args); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { SeedData.Initialize(services); } catch(Exception ex) { var logger = services.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "An error occurred seeding the DB"); } } host.Run(); }
接下來更新資料庫
Update-Database -Verbose
沒有問題,去資料庫裡查看,添加的 種子資料 測試資料並沒有加進來SQL Profile中並沒有監測到添加資料操作。在Main方法加個斷點,啟動IIS執行,逐步執行,發現,只有在程式啟動並執行時候,才會添加 種子 測試資料到資料庫。