实体框架代码第一个可选的一对一关系,没有反向导航属性

时间:2013-01-21 23:35:29

标签: c# ef-code-first entity-framework-5

我试图模拟我认为是一个非常基本的场景,但我无法理解在EF Code First 5中定义它的正确方法。

我有三个班级:

员工 邮寄地址 联系电话号码

因此规则如下:

  • 邮政地址可以是独立的
  • 联系电话号码可以是独立的
  • 可选地,员工可以拥有“主页”邮政地址
  • 员工可以拥有零个或多个联系电话号码

如果我在SQL中对此进行建模,我最终会得到四个表格;

  • 的PostalAddress
  • ContactTelephoneNumber
  • 员工
  • EmployeeContactTelephoneNumber(桥牌表)

通过查看SO上的答案,我可以在Code First中生成类似于我的SQL模型的东西,除了我必须在PostalAddress上有一个Employee导航属性和在ContactTelephoneNumber上有一个Employees导航属性。这违反了我的业务规则,因为PostalAddress和ContactTelephoneNumber都不会被称为Employee。例如,我以后可以添加一个也有PostalAddress的Premises类。

通过代码示例,我现在拥有的内容类似于以下内容:

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

这不编译;我明白了:

  

类型'PostalAddress?'必须是引用类型才能在泛型类型或方法'System.Data.Entity.ModelConfiguration.EntityTypeConfiguration.HasOptional(System.Linq.Expressions.Expression&gt;)'

中将其用作参数'TTargetEntity'

此外,我不喜欢我将“PostalAddressID”作为字符串常量传递给对MapKey()的调用。

请有人能突出我的方式错误吗?我一直在寻找过去3个小时无济于事!

编辑:我应该提一下,一旦我理解了这一部分,我将尝试分别解决员工&gt; ContactTelephoneNumbers情况。

1 个答案:

答案 0 :(得分:0)

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

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

public virtual PostalAddress HomeAddress {get;set;}

要指定映射,我认为你可以使用它:

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

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