我正在尝试实现一个相对简单的概念,但看起来像EF代码首先没有一个简单的方法来做到这一点。基本上我有一个地址类,它也有一个County属性。我正在映射到现有表。在某些情况下,该表有一个用于县的字段,而在其他情况下则没有。所以我只是试图忽略不适用的县。
Fluent API允许映射到Complex Type的属性:
.Property(Function(c) c.HomeAddress.County).HasColumnName("COUNTY")
太棒了。但显然它不允许你忽略它:
.Ignore(Function(c) c.HomeAddress.County)
引发错误:
表达式'p => p.Address.County'不是有效的属性表达式。表达式应代表一个属性:C#:'t => t.MyProperty'VB.Net:'Punction(t)t.MyProperty'。
这应该在Fluent API中允许,并且应该像上面的语句一样简单。
所以按照惯例,Code首先认为它是一个属性,你得到错误:
“无效的列名称'Address_County'。
这太糟糕了!所以我基本上坚持这个属性。我怎么忽略它?有什么想法吗?
我不想删除该属性,我无法将其添加到表中。我尝试添加注释,代码可以工作,但是在我需要的情况下我无法映射它。
我希望有一个简单的解决方案,或者至少是一个适当的解决方案。
答案 0 :(得分:5)
您可以忽略6.1.1中的复杂类型属性(不知道它何时开始获得支持)
public class MyDbContext
: DbContext
{
//...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder
.ComplexType<[complex-type-class]>()
.Ignore(x => x.[member-to-ignore]);
}
//...
}
答案 1 :(得分:1)
虽然我不是百分百肯定,但我认为你不能忽视复杂类型的一部分。但是你可以创建两种不同的复杂类型(因为这实际上就是这种情况),也许EF可以从另一种中导出一种(不确定)。或者创建一个视图,它将具有此列,但是具有NULL(这仍然是字符串的默认值)。
答案 2 :(得分:1)
这是不可能的,目前它是设计的。 EF代码首先仍在内部使用EDM,EDM具有非常严格的规则。
复杂类型定义本身会将其添加到模型中,但映射只能将已定义的属性指向正确的数据库列。它不能忽略已定义的属性(因为它必须被映射)。忽略该属性的唯一方法是复杂类型定义,但在这种情况下,您的属性永远不会被映射。
结论:使用复杂类型后,必须在该类型的所有用法中映射所有属性。如果您有单个案例,则无法映射复杂类型的任何属性,必须在所有情况下从复杂类型中删除该属性,否则您无法使用该复杂类型。