簡體   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