繁体   English   中英

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

我已经按照这个例子做种子,但我得到了

无法添加实体类型“受益人”的种子实体,因为 > 为属性“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM