EF 4.2,Code First - 复杂类型中的导航属性

时间:2011-12-23 12:21:07

标签: entity-framework entity-framework-4.1 ef-code-first code-first

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

我有一个包含Complext类型“CrmData”的Customer实体。 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; }
}

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; }
}

1 个答案:

答案 0 :(得分:14)

复杂类型cannot contain navigation properties。导航属性只能在实体中定义。所以你必须:

  • 使用table splitting代替复杂类型但会导致其他问题 - 例如,您将无法嵌套这些类型,您将不得不使用预先加载/延迟加载来加载它们。
  • 将所有导航属性移至主实体