在EF 4.1中映射子类是否需要ID属性?

时间:2011-12-09 17:30:34

标签: c#-4.0 entity-framework-4.1

我开始将一些代码移到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的属性?从设计的角度来看,这似乎是多余的。

1 个答案:

答案 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等,具体取决于关系的基数和多样性。