EF 4.2,CodeFirst - 在Complext类型中的导航属性

And*_*ell 7 entity-framework code-first ef-code-first entity-framework-4.1

我知道我可以通过将所有内容推送到单个实体而不是嵌套复杂类型(因为它们只是1-1映射)来解决这个问题,但我喜欢它在生成的OM中对属性进行分组的方式.

我有一个Customer实体,其中包含一个Complext类型"CrmData".CrmData实体具有复杂类型的地址.

public class Customer {
  [Required]
  public CrmSpecificData CrmData { get; set; }
}
[ComplexType]
public class CrmSpecificData {
  [MaxLength(40)]
  public string FirstName { get; set; }

  [MaxLength(80)]
  public string LastName { get; set; }

  public Address Address { get; set; }
}
[ComplexType]
public class Address {
  [MaxLength(150)]
  public string Address1 { get; set; }

  [MaxLength(150)]
  public string Address2 { get; set; }

  [MaxLength(100)]
  public string City { get; set; }

  [MaxLength(15)]
  public string PostalCode { get; set; }

  public StateProvince StateOrProvince { get; set; }

  public virtual CountryRegion CountryOrRegion { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

StateProvince和CountryRegion类型是我的数据库中的实体(类似于AdventureWorks示例数据库的工作方式).问题是当EF尝试创建模型时,它失败了:

"MyCo.Crm.Entities.StateProvince"类型已经配置为实体类型.它不能重新配置为复杂类型..

我试过让StateProvince成为一个复杂类型,但这并没有解决问题.想法?

public class StateProvince {
  [Key]
  public int StateProvinceId { get; set; }

  [MaxLength(3)]
  public string StateProvinceCode { get; set; }

  [MaxLength(50)]
  public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Lad*_*nka 14

复杂类型不能包含导航属性.导航属性只能在实体中定义.所以你必须:

  • 使用表拆分而不是复杂类型,但这会导致另一个问题 - 例如,您将无法嵌套这些类型,您将不得不使用eager/lazy加载来加载它们.
  • 将所有导航属性移动到主实体