[英]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.