【问题标题】:Configure Owned property in EF Core在 EF Core 中配置拥有的属性
【发布时间】:2019-01-15 19:05:37
【问题描述】:

编辑:原始问题陈述仅包含对拥有实体的一个引用。但事实证明,我遇到的问题是多次引用 Owned 实体和一些时髦的流畅配置代码。我重写了这个问题陈述来解释我遇到的问题的细节。

我从一个引用 Owned 实体的 EF Core 实体开始:

public class InvoiceItem
{
    public SubscriptionPlanDetails SubscriptionPlan { get; set; }
}

[Owned]
public class SubscriptionPlanDetails
{
    public string PlanName { get; set; }                // Plan name
    public decimal Price { get; set; }                  // Price (USD)
}

当我在 VS 包管理器控制台中输入命令“add-migration”时,脚手架抱怨:

没有为实体类型“SubscriptionPlanDetails”上的小数列“价格”指定类型。

所以我添加了一些流畅的API配置:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<SubscriptionPlanDetails>()
        .Property(p => p.Price)
        .HasColumnType("money");
}

问题解决了……至少我是这么想的。然后我添加了另一个引用同一个拥有实体的实体:

public class Account
{
    public int Id { get; set; }

    public SubscriptionPlanDetails SubscriptionPlan { get; set; }

    // Navigation properties
    public virtual ICollection<InvoiceItem> InvoiceItems { get; set; }
}

因此,每个帐户都有一个订阅计划 (Account.SubscriptionPlan),每个帐户都有多个 InvoiceItems,每个 InvoiceItems 都包含在创建发票项目时有效的订阅计划的所有详细信息 (@ 987654326@).

现在,当我尝试添加迁移时,它会抱怨

没有为实体类型“InvoiceItem.SubscriptionPlan#SubscriptionPlanDetails”上的小数列“价格”指定类型。

所以我添加了流畅的 API 代码来配置 Owned 属性。但是我忽略了删除以前的代码。因此,我的配置代码如下所示:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    // This should have been removed!
    builder.Entity<SubscriptionPlanDetails>()
        .Property(p => p.Price)
        .HasColumnType("money");

    builder.Entity<Account>().OwnsOne(m => m.SubscriptionPlan)
        .Property(p => p.Price)
        .HasColumnType("money");

    builder.Entity<InvoiceItem>().OwnsOne(m => m.SubscriptionPlan)
        .Property(p => p.Price)
        .HasColumnType("money");
}

尝试添加迁移会得到NullReferenceException

如果我注释掉对builder.Entity&lt;SubscriptionPlanDetails&gt;() 的违规调用,那么它会按预期工作!

【问题讨论】:

  • 第二个应该可以。您从哪里获得 NRE?
  • 在 VS 中添加迁移时得到 NRE
  • Thar 很奇怪,因为我已经尝试过你的代码并且它适用于我(EF Core 2.1,SqlServer)
  • 啊哈!弄清楚了。 NRE 的发生是因为一些剩余的配置代码(请参阅完全重写的问题陈述)。我走在正确的轨道上......我偶然发现了一个不相关的问题。

标签: .net-core ef-core-2.0


【解决方案1】:

我认为覆盖此十进制警告的最佳方法是使用以下注释价格:

[Column(TypeName = "decimal(18,2)")]
public decimal Price { get; set; }

您也可以使用类型“money”而不是“decimal(18,2)”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2020-06-22
    相关资源
    最近更新 更多