1

我正在尝试对我认为非常基本的场景进行建模,但我无法理解在 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 的情况。

4

1 回答 1

0

您已将 HomeAddress 声明为值类型,特别是作为Nullable<T>.

去除那个 ?来自声明(引用类型允许为 null,因此不需要包装在 Nullable 结构中)。

public virtual PostalAddress HomeAddress {get;set;}

要指定映射,我认为您可以使用以下命令:

this.HasOptional( e => e.HomeAddress ).WithMany().HasForeignKey( e => e.HomeAddressID );

您还需要将 HomeAddressID 属性添加到 Employee 类。

于 2013-01-21T23:38:31.463 回答