【问题标题】:Seed owned type in EF Core 5EF Core 5 中的种子拥有类型
【发布时间】:2022-01-01 16:08:32
【问题描述】:

我有以下配置,我想为其提供一些种子值。

 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 但我得到了

无法添加实体类型“Beneficiary”的种子实体,因为 > 为属性“Id”提供的值“-1”不是“long”类型。

【问题讨论】:

    标签: c# entity-framework-core ef-core-5.0


    【解决方案1】:

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

    您正在退出拥有的实体构建器范围(类似于链接的后加入实体构建器),下一个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"
            });
        });
    

    【讨论】:

      猜你喜欢
      • 2021-04-28
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2021-10-22
      • 2020-06-03
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多