EF 4.2忽略代码中的单个属性,首先映射到复杂类型

时间:2012-01-05 23:35:00

标签: entity-framework frameworks entity code-first

我正在尝试实现一个相对简单的概念,但看起来像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'。

这太糟糕了!所以我基本上坚持这个属性。我怎么忽略它?有什么想法吗?

我不想删除该属性,我无法将其添加到表中。我尝试添加注释,代码可以工作,但是在我需要的情况下我无法映射它。

我希望有一个简单的解决方案,或者至少是一个适当的解决方案。

3 个答案:

答案 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具有非常严格的规则。

  • 您可以定义复杂类型,但其所有属性都将成为模型的一部分
  • 必须映射作为模型一部分的实体类型或复杂类型的每个属性

复杂类型定义本身会将其添加到模型中,但映射只能将已定义的属性指向正确的数据库列。它不能忽略已定义的属性(因为它必须被映射)。忽略该属性的唯一方法是复杂类型定义,但在这种情况下,您的属性永远不会被映射。

结论:使用复杂类型后,必须在该类型的所有用法中映射所有属性。如果您有单个案例,则无法映射复杂类型的任何属性,必须在所有情况下从复杂类型中删除该属性,否则您无法使用该复杂类型。