我正在尝试使用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'提供值。'
答案 0 :(得分:1)
播种时必须为RegisteredAddressId
指定一个值,在这里不能依靠数据库的自动生成。参见https://github.com/aspnet/EntityFrameworkCore/issues/11776#issuecomment-383756228:
仅在这里详细说明为什么不支持存储生成的值。在模型中包含数据的想法是,当模型演化时,数据库中的种子数据也随之演化。但是要使其正常工作,模型中的每个实体都需要具有一个众所周知的键值,以便以后可以找到并更新它。可以随意使用更多传统的种子植入机制,例如,只需要将一些数据初始化为空数据库的测试。