我们的团队正在使用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或代码时如何实现这一点的任何想法都会很棒。提前谢谢。
答案 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提供的适当的继承方法