我正在尝试对我认为非常基本的场景进行建模,但我无法理解在 EF Code First 5 中定义它的正确方法。
我有三个班级:
员工邮寄地址 联系电话
规则如下:
- 邮政地址可以是独立的
- 联系电话号码可以是独立的
- 可选地,员工可以有一个“家庭”邮政地址
- 员工可以有零个或多个联系电话号码
如果我在 SQL 中对此进行建模,我最终会得到四个表;
- 邮寄地址
- 联系电话号码
- 员工
- EmployeeContactTelephoneNumber(桥接表)
通过查看 SO 上的答案,我可以在 Code First 中生成类似于我的 SQL 模型的内容,但我必须在 PostalAddress 上拥有一个员工导航属性,在 ContactTelephoneNumber 上拥有一个员工导航属性。这违反了我的业务规则,因为 PostalAddress 和 ContactTelephoneNumber 都不会始终被称为员工。例如,我可以稍后添加一个 Premises 类,该类也有一个 PostalAddress。
通过代码示例,我现在拥有的类似于以下内容:
public class Employee
{
public int EmployeeID {get;set;}
public virtual PostalAddress? HomeAddress {get;set;}
}
public class PostalAddress
{
public int PostalAddressID {get;set;}
public string Address {get;set;} // It's not actually a string - this is for brevity!
}
public class ContactTelephoneNumber
{
public int ContactTelephoneNumberID {get;set;}
public string TelephoneNumber {get;set;} // It's not actually a string - this is for brevity!
}
我正在尝试使用 Fluent API 而不是 Annotations 来定义我的关系,以确保我的表示层在使用这些类时不知道实体框架。我的映射当前类似于以下 - 这是“正确的”吗?
public class EmployeeMap : EntityTypeConfiguration<Employee>
{
public EmployeeMap()
{
this.HasOptional(e => e.HomeAddress).WithOptionalDependent(p => p.Value).Map(m => m.MapKey("PostalAddressID"));
}
}
这不编译;我得到:
类型“邮政地址?” 必须是引用类型才能将其用作泛型类型或方法“System.Data.Entity.ModelConfiguration.EntityTypeConfiguration.HasOptional(System.Linq.Expressions.Expression>)”中的参数“TTargetEntity”
此外,我不喜欢将“PostalAddressID”作为字符串常量传递给对 MapKey() 的调用。
请问有人可以强调我的方式的错误吗?我一直在寻找过去 3 个小时无济于事!
编辑:我应该提到,一旦我理解了这部分,我将尝试分别解决 Employee>ContactTelephoneNumbers 的情况。