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"
        });
    });