[英]Seed owned type in EF Core 5
我有以下配置,我想为其提供一些种子值。
void IEntityTypeConfiguration<Beneficiary>.Configure(EntityTypeBuilder<Beneficiary> builder)
{
builder.HasKey(pk => pk.Id);
builder.Property(pk => pk.Id)
.UseIdentityColumn()
.ValueGeneratedOnAdd();
builder.HasData(
new
{
Id = -1,
});
builder
.OwnsOne(self => self.Invoice,
nav =>
{
nav.ToTable("Invoices");
nav.Property(nav => nav.Number).HasMaxLength(16).IsRequired();
nav.Property(nav => nav.IssueDate).HasDefaultValueSql("getutcdate()");
})
.HasData(new
{
BeneficiaryId = -1,
Number = "000"
});
builder
.Navigation(self => self.Invoice)
.IsRequired();
}
我已经按照这个例子做种子,但我得到了
无法添加实体类型“受益人”的种子实体,因为 > 为属性“Id”提供的值“-1”不是“long”类型。
这与How to fix EF Core migration error on join table configuration非常相似,但适用于自有实体类型。
小心流利的 API 重载,因为它们返回不同的东西。 例如,没有构建器操作委托的OwnsOne
返回一个拥有实体类型的构建器。 但是带有操作的重载会返回原始(所有者)实体构建器,因此您可以继续配置它(拥有实体的配置被认为在操作委托内)。
在你的情况下,在这里
.OwnsOne(self => self.Invoice,
nav =>
{
nav.ToTable("Invoices");
nav.Property(nav => nav.Number).HasMaxLength(16).IsRequired();
nav.Property(nav => nav.IssueDate).HasDefaultValueSql("getutcdate()");
}) // <-- problem
.HasData(new
{
BeneficiaryId = -1,
Number = "000"
});
您正在退出拥有的实体构建器 scope (类似于链接的连接后实体构建器),下一个HasData
实际上是为Beneficiary
而不是为预期的Invoice
定义种子数据。 由于您使用的是匿名类型,因此 C# 很乐意接受它,并且您在运行时会收到该错误。
要解决此问题,只需将数据播种移动到适当的位置,例如
.OwnsOne(self => self.Invoice,
nav =>
{
nav.ToTable("Invoices");
nav.Property(nav => nav.Number).HasMaxLength(16).IsRequired();
nav.Property(nav => nav.IssueDate).HasDefaultValueSql("getutcdate()");
// move here
nav.HasData(new
{
BeneficiaryId = -1,
Number = "000"
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.