[英]Entity Framework Code First optional one-to-one relationship with no reverse navigation property
我正在尝试对我认为非常基本的场景进行建模,但是我无法正确理解在EF Code First 5中定义它的正确方法。
我有三节课:
员工邮寄地址联系电话
因此,规则是:
如果用SQL对此模型建模,最终将得到四个表。
通过查看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.