【发布时间】: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<SubscriptionPlanDetails>() 的违规调用,那么它会按预期工作!
【问题讨论】:
-
第二个应该可以。您从哪里获得 NRE?
-
在 VS 中添加迁移时得到 NRE
-
Thar 很奇怪,因为我已经尝试过你的代码并且它适用于我(EF Core 2.1,SqlServer)
-
啊哈!弄清楚了。 NRE 的发生是因为一些剩余的配置代码(请参阅完全重写的问题陈述)。我走在正确的轨道上......我偶然发现了一个不相关的问题。
标签: .net-core ef-core-2.0