在 EF 4.1 中映射子类是不是需要 ID 属性?
Posted
技术标签:
【中文标题】在 EF 4.1 中映射子类是不是需要 ID 属性?【英文标题】:Does mapping a child class in EF 4.1 require an ID property?在 EF 4.1 中映射子类是否需要 ID 属性? 【发布时间】:2011-12-09 17:30:34 【问题描述】:我开始将一些代码移至 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】:首先,为了具有从一个实体到另一个实体的导航属性,它们必须在您的 POCO 中声明为虚拟。所以你会想要这个:
public class classReservation
public int ReservationID get; set;
public virtual classMember Member get; set;
这是因为在运行时,EF 实际上使用反射子类化了您的 POCO。要使导航属性工作,它需要能够覆盖它。这就是为什么它必须是virtual
。
要回答您的第二个问题,不,您不需要从子实体到父实体的“外键属性”。它有助于 EF,但不是必需的。
我们正在从实体模型中移除外键属性。为此,您仍然需要告诉 EF 如何在 db 中映射关系。这可以在您的 DbContext 类的 OnModelCreating 方法中完成:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Entity<classReservation>
.HasRequired(r => r.classMember)
.WithMany()
.Map(x => x.MapKey("MemberId"));
您还可以使用 HasOptional、WithRequiredDependent 等,具体取决于关系的基数和多重性。
【讨论】:
谢谢。这适用于我的 POC 测试代码,但不适用于我正在迁移的代码库。一定有其他问题使它无法加载。 这显然是一个不同的问题。我创建了this article 来找出我的对象层次结构没有完全加载的原因。但是,感谢您帮助我弄清楚我什至没有问对正确的问题。以上是关于在 EF 4.1 中映射子类是不是需要 ID 属性?的主要内容,如果未能解决你的问题,请参考以下文章
EF 4.1 RTM - EntityTypeConfiguration