C#Faker Bogus产生拥有的财产

时间:2018-12-06 16:40:25

标签: c# entity-framework-core bogus

我正在尝试使用Bogus库在.Net Core 2.1应用程序中使用EF Core进行数据管理,以生成随机种子数据。

我有一个名为Company的对象,它拥有一个地址;这是一对一的关系。

公司型号:

    public class Company
{
    public long Id { get; set; }
    [Required]
    public Address Address { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public string Website { get; set; }
}

地址模型:

public class Address : IValidatableObject
{
    public long Id { get; set; }
    public string Street1 { get; set; }
    public string Street2 { get; set; }
    public string ZipCode { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
}

DbContext中可用的种子代码:

 var TestAddresses = new Faker<Address>()
            .RuleFor(o => o.Id, f => aId++)
            .RuleFor(o => o.Street1, f => f.Address.StreetAddress(true))
            .RuleFor(o => o.Country, f => f.Address.Country())
            .RuleFor(o => o.City, f => f.Address.City());

        var c = new Faker<Company>()
            .RuleFor(o => o.Id, f => f.IndexFaker+1)

            .RuleFor(o => o.RegisteredAddress, f => TestAddresses.Generate())
            .RuleFor(o => o.Phone, f => f.Phone.ToString())
            .RuleFor(o => o.Email, f => f.Internet.Email())
            .FinishWith((f, u) =>
            {
                Console.WriteLine("Company created! Id = {0}", u.Id);
            });

        b.Entity<Company>().HasData(c.Generate(100).ToArray());

运行代码时,出现以下异常: System.InvalidOperationException:'无法添加实体类型'Company'的种子实体,因为没有为所需属性'RegisteredAddressId'提供值。'

1 个答案:

答案 0 :(得分:1)

播种时必须为RegisteredAddressId指定一个值,在这里不能依靠数据库的自动生成。参见https://github.com/aspnet/EntityFrameworkCore/issues/11776#issuecomment-383756228

  

仅在这里详细说明为什么不支持存储生成的值。在模型中包含数据的想法是,当模型演化时,数据库中的种子数据也随之演化。但是要使其正常工作,模型中的每个实体都需要具有一个众所周知的键值,以便以后可以找到并更新它。可以随意使用更多传统的种子植入机制,例如,只需要将一些数据初始化为空数据库的测试。