在 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:将类属性映射到行而不是列

EF 4.1 RTM - EntityTypeConfiguration

一个存储实体属性是不是只能映射到EF中的一个类实体属性?

使用EF 4.1 Fluent Code First的每类型表继承

EF 4.1 复杂关系的实体映射

添加导航属性会破坏微风客户端映射(但不是服务器端 EF6)