我试图模拟我认为是一个非常基本的场景,但我无法理解在EF Code First 5中定义它的正确方法。
我有三个班级:
员工 邮寄地址 联系电话号码
因此规则如下:
如果我在SQL中对此进行建模,我最终会得到四个表格;
通过查看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情况。
答案 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类。