首先使用代码,我需要将导航属性映射到未映射到表的基类列表

时间:2014-08-19 15:35:18

标签: entity-framework entity-framework-6

我目前正在使用代码优先方法对数据库建模,我希望Entity Framework根据我的类为我生成数据库。

我遇到了Entity Framework无法为我生成数据库的问题。为了更好地解决我面临的问题,我将使用手机中的联系电话簿进行类比。

让我们假设我有一个名为" Contact"的类,这个类有一个列表,可以容纳多个" ContactSource" s。 " ContactSource"是一个抽象基类,它的派生类可以是" FacebookContactSource"," TwitterContactSource"等等。这个想法是"联系"可以由多个来源"组成,例如您的智能手机和#34;合并"您将来自不同帐户的联系人转换为单个联系人。

我的课程是这样定义的:

public class Contact
{
    public int ContactId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<ContactSource> Sources { get; set; }
}

public abstract class ContactSource
{
    // Navigation property to a parent Contact which all
    // derived classes should have.
    public virtual Contact Parent { get; set; }
}

public class FacebookContactSource : ContactSource
{
    public int FacebookContactSourceId { get; set; }
    public string FacebookId { get; set; }
}

public class TwitterContactSource : ContactSource
{
    public int TwitterContactSourceId { get; set; }
    public string TwitterId { get; set; }
}

&#34; ContactSource&#34;派生类不会将导航属性以外的任何属性共享到&#34; Parent&#34;在基类本身声明的联系人。

应该有这样的一对多关系:

Contact        1 .. *  ContactSource

所以,&#34;联系&#34;可以有多个&#34; ContactSource&#34; s,以及每个&#34; ContactSource&#34;必须有一个&#34;联系&#34;。

我的Context类就像这样简单:

public class MyContext : DbContext
{
    public DbSet<Contact> { get; set; }
    public DbSet<FacebookContactSource> { get; set; }
    public DbSet<TwitterContactSource> { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // how to configure relationships?
    }
}

我的问题是:使用覆盖&#34; OnModelCreating&#34;在我的DbContext派生类中,如何在我的&#34; ContactSource&#34;上配置一对多关系?派生实体到我的&#34;联系人&#34;的导航属性类?

我试过这个,但它不会编译:

modelBuilder.Entity<FacebookContactSource>().HasRequired(s => s.Parent).WithMany(c => c.Sources);

它没有编译的原因是因为我不能隐式地将ICollection of Contact转换为FacebookContactSource的ICollection,但是,我不确定是否将一个集合类型转换为另一个集合类型使它成为实体框架正确映射此导航属性。

我应该如何建立这种关系,以及我模型上的其他关系?

0 个答案:

没有答案