繁体   English   中英

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

[英]Entity Framework Code First optional one-to-one relationship with no reverse navigation property

我正在尝试对我认为非常基本的场景进行建模,但是我无法正确理解在EF Code First 5中定义它的正确方法。

我有三节课:

员工邮寄地址联系电话

因此,规则是:

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

如果用SQL对此模型建模,最终将得到四个表。

  • 邮寄地址
  • 联系电话
  • 雇员
  • EmployeeContactTelephoneNumber(桥接表)

通过查看SO上的答案,我可以在Code First中生成类似于SQL模型的内容,除了我必须在PostalAddress上具有Employee导航属性,并在ContactTelephoneNumber上具有Employees导航属性。 这违反了我的业务规则,因为PostalAddress和ContactTelephoneNumber都不会始终被称为Employee。 例如,我以后可以添加一个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而不是注释来定义我的关系,以确保在使用这些类时,我的表示层不了解Entity Framework。 我的映射当前类似于以下内容-此“正确”吗?

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>)”中的参数“ TTargetEntity”,必须为引用类型

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

请有人能强调我的方式的错误吗? 我一直在搜索过去3小时无济于事!

编辑:我应该提到,一旦我理解了这一部分,我将尝试分别解决Employee> ContactTelephoneNumbers的情况。

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

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

public virtual PostalAddress HomeAddress {get;set;}

要指定映射,我想您可以使用以下方法:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM