当基来自 EF4.1 DbContext 时,如何创建继承的类

本文关键字:何创建 创建 继承 EF4 DbContext | 更新日期: 2023-09-27 17:56:04

我们的团队正在使用实体框架4.1 ORM。我们不是在代码优先模式下使用它,但我们使用的是此版本中干净的 POCO 生成功能。

我们遇到的是,我们希望创建一个基于 EF POCO 的继承类,但到目前为止,我们可以看到这种情况发生的唯一方法是在数据库中有一个映射表。有没有更好的方法来创建这个继承的实体?下面的代码是我们正在谈论的一个例子。

此类生成:

public partial class Member
{
public Member()
{
    this.ContactAddresses = new HashSet<ContactAddress>();
    this.ContactEmails = new HashSet<ContactEmail>();
    this.FormDatas = new HashSet<FormData>();
    this.ContactPhones = new HashSet<ContactPhone>();
}
public int ID { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string Alias { get; set; }
public string Title { get; set; }
public string Company { get; set; }
public string Prefix { get; set; }
public string Suffix { get; set; }
public System.DateTime CreatedDate { get; set; }
public int CreatedBy { get; set; }
public Nullable<System.DateTime> ModifiedDate { get; set; }
public Nullable<int> ModifiedBy { get; set; }
public Nullable<System.Guid> AspNetUserID { get; set; }
public virtual aspnet_Users aspnet_Users { get; set; }
public virtual ICollection<ContactAddress> ContactAddresses { get; set; }
public virtual ICollection<ContactEmail> ContactEmails { get; set; }
public virtual ICollection<FormData> FormDatas { get; set; }
public virtual ICollection<ContactPhone> ContactPhones { get; set; }
}

这是我们想要创建的一个例子:

public class SpecificMember : Member 
{
public SpecificMember()
{
    this.Assignments = new HashSet<Assignment>();
    this.Expertises = new HashSet<Expertise>();
    this.Experiences = new HashSet<Experience>();
    }this.VendorInformations = new HashSet<VendorInformation>();
public virtual ICollection<Assignment> Assignments { get; set; }
public virtual ICollection<Expertise> Expertises { get; set; }
public virtual ICollection<Experience> Experiences { get; set; }
public virtual ICollection<VendorInformation> VendorInformations { get; set; }
}

我真的很想远离在数据库中放置另一个表。我的想法是,我们在这里只处理类,但我不确定这两个实体如何相互合作。

关于如何在使用实体框架或在代码中完成此操作的任何想法都会很棒。提前谢谢。

当基来自 EF4.1 DbContext 时,如何创建继承的类

这在 EF4.1 中称为复杂类型,有几个选项可供您使用。可以将它们放在单独的表中(称为"每个类型表"),也可以将它们放在同一个表中(称为"每个层次结构的表"),这意味着将向表添加一个鉴别器列,以告知 EF 它是什么类型。

我还没有经常使用它,但这在 EF4.1 中似乎非常非常强大

查看这篇由多个部分组成的文章,大致了解在 EF4.1 中处理复杂类型。它是针对 CTP5 编写的,但对我来说看起来很准确。

我认为你想要的就在这个页面上。

如果要映射到现有数据库或想要手动控制架构,本文提供了另一个处理现有数据库的此方案的示例。

我有类似的要求,我想为生成的 POCO 类(使用 t4 模板)使用属性。我从一个非常好的EF用户那里得到了以下回复。

简而言之,您有两种选择,使用 Code First 方法,该方法为您的 POCO 类提供了充分的灵活性,或者修改 t4 模板以满足您的需求。如果您不想使用这两种方法,可以在数据库中创建单独的表。

不幸的是,我们都在同一个船友,需要一些妥协或更多的工作才能得到我们想要的东西。 :)

你需要做的是使基 Member 类抽象,以及你的 specificMember 和类似的类具体化。这将为抽象 Member 类的每个具体实现创建/需要一个表。

每个具体类都可以映射到单个表。只能有一个 DbSet ,但可以使用此具体类来保存许多不同表的关系信息。

在您的示例中,您可以在从成员派生的许多不同实体中重复使用 FormData、ContactData、ContactAddress 或完全不同的实体。

但是,如果您希望为ContactData或ContactAddress提供不同的类,则需要选择EF4.1提供的适当继承方法之一