2011-12-09 61 views
2

我开始将一些代码移到EF4.1,并且在加载子类时出现问题。在EF 4.1中映射子类是否需要ID属性?

我发现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只是给空成员。

我是否需要在classReservation以及classMember中包含MemberID的属性?从设计的角度来看,这似乎是多余的。

回答

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

+0

谢谢。这适用于我的POC测试代码,但不适用于我正在迁移的代码库。必须有一些其他问题,以防止加载。 –

+0

这显然是一个不同的问题。我已经创建[这篇文章](http://stackoverflow.com/questions/8466929/why-do-some-subobjects-load-and-others-dont)找出为什么我的对象层次结构没有完全加载。但是,感谢帮助我发现我甚至没有提出正确的问题。 –

相关问题