我开始将一些代码移到EF4.1,我在加载子类时遇到问题。
我找到了this article,看起来有一种映射子类的方法,但我想知道父类中的ID列是否是必需的。
我认为仅仅包含对子类的引用是“无代码”,剩下的就是照顾。
这是当前的对象模型:
public class classMember
{
public int MemberID {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
}
public class classReservation
{
public int ReservationID {get; set;}
public classMember Member {get; set;}
}
但是加载classReservation只会给出null成员。
我是否需要在classReservation和classMember中包含MemberID的属性?从设计的角度来看,这似乎是多余的。
答案 0 :(得分:1)
首先,为了将导航属性从一个实体转移到另一个实体,必须在POCO中将它们声明为虚拟。所以你会想要这个:
public class classReservation
{
public int ReservationID {get; set;}
public virtual classMember Member {get; set;}
}
这是因为在运行时,EF实际上是使用反射对您的POCO进行子类化。要使导航属性有效,它需要能够覆盖它。这就是为什么它必须是virtual
。
要回答第二个问题,不,您不需要从子实体到父实体拥有“外键属性”。它有助于EF,但不是必需的。
我们正在从实体模型中删除外键属性。要做到这一点,您仍然需要告诉EF如何映射数据库中的关系。这可以在您的DbContext类'OnModelCreating方法:
中完成protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<classReservation>
.HasRequired(r => r.classMember)
.WithMany()
.Map(x => x.MapKey("MemberId"));
}
您还可以使用HasOptional,WithRequiredDependent等,具体取决于关系的基数和多样性。