繁体   English   中英

由Code First EF Core DB制作的种子数据库

[英]Seeding DB made by Code First EF Core DB

我想知道在EF Core建立数据库之后立即生成所需数据的最佳方法是什么。

我看到人们在C#代码中创建类来做到这一点,但是如果您有很多数据呢? 对我来说,我必须从我的系统中从美国进口所有州。

我认为最好运行某种sql脚本来执行此操作,但是我想重复检查需要一些检查。

编辑

假设我要使用在数据库中找到的这些脚本。 因此,当我的项目第一次运行时自动生成数据库时,将填充它们。

https://github.com/hiiamrohit/Countries-States-Cities-database

如果您使用的是EF Core 2.1,他们实际上已经添加了一个非常不错的新功能。

EF Core 2.1发行公告

现在,在OnModelCreating方法中,您可以在Entity方法上使用HasData扩展方法。

这是两个示例:

modelBuilder.Entity<Blog>().HasData(new Blog {BlogId = 1, Url = "http://sample.com"});

modelBuilder.Entity<Post>().HasData(
    new {BlogId = 1, PostId = 1, Title = "First post", Content = "Test 1"},
    new {BlogId = 1, PostId = 2, Title = "Second post", Content = "Test 2"});

要生成大量数据,您可以使用像Bogus这样的库,它“在本质上是C#的faker.js端口,并受到FluentValidation语法糖的启发”。 我们在项目中使用它,它非常适合。 您可以生成真实姓名,真实国家,真实电话号码等。来自GitHub的示例:

var testUsers = new Faker<User>()
    .CustomInstantiator(f => new User(userIds++, f.Random.Replace("###-##-####")))
    .RuleFor(u => u.Gender, f => f.PickRandom<Gender>())
    .RuleFor(u => u.FirstName, (f, u) => f.Name.FirstName(u.Gender))
    .RuleFor(u => u.LastName, (f, u) => f.Name.LastName(u.Gender))
    .RuleFor(u => u.Avatar, f => f.Internet.Avatar())
    .RuleFor(u => u.UserName, (f, u) => f.Internet.UserName(u.FirstName, u.LastName))
    .RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName))
    .RuleFor(u => u.SomethingUnique, f => $"Value {f.UniqueIndex}")
    .RuleFor(u => u.CartId, f => Guid.NewGuid())
    .RuleFor(u => u.FullName, (f, u) => u.FirstName + " " + u.LastName)
    .RuleFor(u => u.Orders, f => testOrders.Generate(3).ToList())
    .FinishWith((f, u) =>
        {
            Console.WriteLine("User Created! Id={0}", u.Id);
        });

var user = testUsers.Generate(10000); // Generated 10000 users that match rules

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM