Asp.net Core 由於依賴註入的廣泛使用,配置數據遷移,與Asp.net大不相同,本篇介紹一下Asp.net Core添加數據遷移的過程 添加Nuget包 首先新建一個 Model 類 User: public class User { //用戶編號(自增長主鍵) [Key] public ...
Asp.net Core 由於依賴註入的廣泛使用,配置數據遷移,與Asp.net大不相同,本篇介紹一下Asp.net Core添加數據遷移的過程
添加Nuget包
Install-Package Microsoft.EntityFramework.SqlServer
Install-Package Microsoft.EntityFramework.Tools
Install-Package Microsoft.EntityFramework.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),哎,說多了都是淚。
添加一個初始化數據類,命名為SeedData.cs
public static class SeedData
{
/// <summary>
///
/// 配置Seed
///
/// </summary>
public static void Initialize(IServiceProvider app)
{
var _dbContext= app.GetRequiredService<BlogDbContext>();
//如果已經有數據就直接返回
if(_dbContext.Users.Any())
{
return;
}
//添加User Seed
_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執行,逐步執行,發現,只有在程式運行的時候,才會添加種子數據到資料庫。