在EF Core中配置拥有的属性

时间:2018-06-28 05:12:23

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

编辑:原始问题说明仅包含对拥有实体的一个引用。但是事实证明,我遇到的问题发生在对拥有的实体的多个引用以及一些时髦的流利的配置代码上。我已重写此问题说明,以解释遇到的问题的详细信息。

我从一个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 Package Manager控制台中输入命令“ 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),每个帐户都有多个InvoiceItem,其中每个项目都包含创建发票项目时生效的订阅计划的所有详细信息(Account.InvoiceItems.SubscriptionPlan

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

  

未为实体类型“ 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<SubscriptionPlanDetails>()的恶意呼叫,那么它将按预期工作!

1 个答案:

答案 0 :(得分:0)

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

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

您也可以使用“ money”类型代替“ decimal(18,2)”

相关问题