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

时间:2011-05-12 00:36:04

标签: c# asp.net-mvc entity-framework entity-framework-4.1

我们的团队正在使用Entity Framework 4.1 ORM。我们没有在Code First模式下使用它,但是我们正在使用此版本中的干净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; }

}

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

在使用Entity Framework或代码时如何实现这一点的任何想法都会很棒。提前谢谢。

3 个答案:

答案 0 :(得分:3)

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

我还没有使用它,但在EF4.1中这看起来非常强大

查看这篇多部分文章,了解处理Complex Types in EF4.1的概述。它是针对CTP5编写的,但看起来很准确。

我认为你想要的是this page here

如果要映射到现有数据库或想要手动控制架构,this article还有另一个处理现有数据库场景的示例。

答案 1 :(得分:2)

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

简而言之,您有两个选择,使用Code First方法,它为您提供POCO类的完全灵活性,或者修改t4模板以满足您的需要。如果您不想使用其中任何一种方法,则可以在数据库中创建单独的表。

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

答案 2 :(得分:1)

您需要的是使基本成员类抽象化,并使您的特定成员和类似类具体化。这将为抽象Member类的每个具体实现创建/需要一个表。

每个具体类都可以映射到单个表。 你只能有一个DbSet&lt; concreteClass&gt;但是你可以使用这个具体的类来保存与许多不同表格的关系信息。

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

但是如果你想要ContactData或ContactAddress的不同类,那么你需要选择一种EF4.1提供的适当的继承方法