【问题标题】: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 的属性吗?从设计的角度来看,这似乎是多余的。

【问题讨论】:

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


    【解决方案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 来找出我的对象层次结构没有完全加载的原因。但是,感谢您帮助我弄清楚我什至没有问对正确的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多