EF Core 5 中的种子拥有类型
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();
}
我遵循了这个例子example-to-seed,但我得到了
The seed entity for entity type 'Beneficiary' cannot be added because > the value '-1' provided for the property 'Id' is not of type 'long'.
这与 非常相似,但用于拥有的实体类型。
小心流畅的 API 重载,因为它们 return 不同。例如,OwnsOne
没有构建器操作委托 return 是拥有的实体类型的构建器。但是带有操作的重载 return 是原始(所有者)实体构建器,因此您可以继续配置它(拥有实体的配置被认为是在操作委托中)。
这里是你的情况
.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"
});
您正在退出拥有的实体构建器范围(类似于链接的 post 加入实体构建器),下一个 HasData
实际上是为 Beneficiary
而不是为 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"
});
});
我有以下配置,我想为其提供一些种子值。
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();
}
我遵循了这个例子example-to-seed,但我得到了
The seed entity for entity type 'Beneficiary' cannot be added because > the value '-1' provided for the property 'Id' is not of type 'long'.
这与
小心流畅的 API 重载,因为它们 return 不同。例如,OwnsOne
没有构建器操作委托 return 是拥有的实体类型的构建器。但是带有操作的重载 return 是原始(所有者)实体构建器,因此您可以继续配置它(拥有实体的配置被认为是在操作委托中)。
这里是你的情况
.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"
});
您正在退出拥有的实体构建器范围(类似于链接的 post 加入实体构建器),下一个 HasData
实际上是为 Beneficiary
而不是为 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"
});
});