您的位置:首页 > 编程语言 > ASP

Asp.net Core 2.0+EntityFrameWorkCore 2.0添加数据迁移

2017-10-08 17:13 711 查看
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执行,逐步执行,发现,只有在程序运行的时候,才会添加种子 测试数据到数据库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐