C# 代码生成的种子数据库第一个EF核心数据库

C# 代码生成的种子数据库第一个EF核心数据库,c#,entity-framework-core,C#,Entity Framework Core,我想知道在EF Core创建数据库之后,生成所需数据的最佳方法是什么 我看到人们用C#代码创建类来实现这一点,但是如果你有很多数据呢?对我来说,我可以在我的系统中从美国进口所有的州 我认为最好运行某种sql脚本来实现这一点,但我想需要对重复项进行一些检查 编辑 假设我想使用我在数据库中找到的这些脚本。因此,当我的数据库在我的项目第一次运行时自动生成时,它们会被填充 如果您使用的是EF Core 2.1,他们实际上添加了一个非常好的新功能 在DbContext的OnModelCreating方法

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

我看到人们用C#代码创建类来实现这一点,但是如果你有很多数据呢?对我来说,我可以在我的系统中从美国进口所有的州

我认为最好运行某种sql脚本来实现这一点,但我想需要对重复项进行一些检查

编辑

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


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

在DbContext的
OnModelCreating
方法中,实体方法上现在有了一个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"});
modelBuilder.Entity().HasData(新博客{BlogId=1,Url=”http://sample.com"});
modelBuilder.Entity().HasData(
新的{BlogId=1,PostId=1,Title=“First post”,Content=“Test 1”},
新的{BlogId=1,PostId=2,Title=“Second post”,Content=“Test 2”});

要生成大量数据,可以使用一个lib,如“基本上是faker.js的C#port,受FluentValidation语法sugar的启发”。我们在项目中使用它,它非常适合。您可以生成真实姓名、真实国家、真实电话号码等。 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
var testUsers=new Faker()
.CustomInstantiator(f=>新用户(userIds++,f.Random.Replace(“####-##-###”)
.RuleFor(u=>u.Gender,f=>f.picklandom())
.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=>$“值{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)=>
{
WriteLine(“用户创建的!Id={0}”,u.Id);
});
var user=testUsers.Generate(10000);//生成了10000个符合规则的用户

我不认为美国各州是“大量数据”;“你说的仅仅是州名吗?”ChiefTwoPencils-它会越来越多,因为我正在考虑添加其他国家及其州。然后你可以将其视为一个需要不同详细程度的数据集。那么,为什么不只是填充或使用一组数据来提供所有可用信息并过滤掉您现在需要的信息呢?这些数据通常是静态的。我将检查填充开发人员DBs的伪数据…谢谢,我不想制造假数据(尽管这在以后可能会有所帮助)。我正在查看我希望将所有国家及其州/省存储在表格中的要求,以便以后参考。我在问获取这些数据的最佳方法是什么。@chobo2,我不认为这些数据需要伪造;数据定义明确。如果无法通过API轻松获得这些数据,您可以在所有场景中一次性填充这些数据。那么您会问在哪里找到这些数据以及如何填充这些数据?抱歉,这取决于您的特定域。它可能在Internet中可用,也可能有一个公共可用的JSON文件,但这些只是假设——你只需要对你的特定案例进行研究。如果找到JSON文件,您可以编写一些代码,将数据插入数据库。但是,您仍然需要编写某种适配器来适应它们的结构。我们帮不了你更多。这很方便,但我只是不想在存在国家/州脚本的情况下,在我的C代码中手动写入数百行数据。虽然最终可能最好不要混用,而是自己痛苦地添加,就像我要添加(比如)与这些国家有关联的客户一样,如果我通过脚本创建了引用,那么我将无法访问该引用