实体框架代码优先许多对许多关系和继承(Entity Framework Code First Man

2019-08-18 02:09发布

原谅我,如果这个问题已经回答了什么地方,我一直有一个很难找到这个问题的解决方案。

我试图建立EF代码第一次上MVC4项目。 我有一个用户和客户,无论从人继承。 那么我有客户多到多关系,并与用户一到多关系模板对象。 下面是我有它设置:

楷模

public class Person
{
    [Key]
    public int PersonID { get; set; }

    public string LastName { get; set; }
    public string FirstName { get; set; }

    public string FullName
    {
        get
        {
            return String.Format("{0} {1}", FirstName, LastName);
        }
    }

    public string Email { get; set; }

    public virtual List<Template> Templates { get; set; }
}

public class User : Person
{
    .... 
}

public class Customer : Person
{
    ....
}

public class Template
{
    public int TemplateId { get; set; }
    public string TemplateName { get; set; }

    public virtual List<Customer> Customers { get; set; }

    [ForeignKey("User")]
    public int UserId { get; set; }
    public virtual User User { get; set; }
}

CONTEXT

public class ProjectContext : DbContext
{
    public ProjectContext()
        : base("name=ProjectDB")
    {
    }

    public DbSet<Template> Templates { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Customer> Customers { get; set; }
    public DbSet<Person> People { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions
            .Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<Template>()
            .HasMany(x => x.Customers)
            .WithMany(x => x.Templates)
            .Map(x => x.MapLeftKey("TemplateId")
                .MapRightKey("PersonId")
                .ToTable("TemplateCustomer")
            );
    }
}

如果我删除的人DBSet出的背景下能正常工作,但设置了TPT的继承。 我想用TPH继承,但是当我能够与人DBSet迁移的背景下,电抗器:

NavigationProperty“模板”是无效的。 FromRole在AssociationType“MvcProject.Models.Template_Customers” Template_Customers_Target'类型“MvcProject.Models.Customer”必须完全匹配与此NavigationProperty声明的类型“MvcProject.Models.Person”。

我要去哪里错了吗?

Answer 1:

你不能继承从基实体导航属性 。 他们总是必须在关系的另一端指的类中声明

  • Template.Customers是指的Customer (不是Person ),因此逆导航属性Templates必须在申报Customer (不是Person
  • Template.User是指的User (不Person ),因此逆导航属性Templates必须在声明User (未在Person

所以,基本上,你必须移动Templates从收集Person到两个派生类:

public class Person
{
    // no Templates collection here
}

public class User : Person
{
    //... 
    public virtual List<Template> Templates { get; set; }
}

public class Customer : Person
{
    //...
    public virtual List<Template> Templates { get; set; }
}

然后,你可以定义像这样流利的API的两个关系:

modelBuilder.Entity<Template>()
    .HasMany(t => t.Customers)
    .WithMany(c => c.Templates) // = Customer.Templates
    .Map(x => x.MapLeftKey("TemplateId")
               .MapRightKey("PersonId")
               .ToTable("TemplateCustomer"));

modelBuilder.Entity<Template>()
    .HasRequired(t => t.User)
    .WithMany(u => u.Templates) // = User.Templates
    .HasForeignKey(t => t.UserId);


Answer 2:

你的hasMany选择更改人:

    modelBuilder.Entity<Template>()
        .HasMany(x => x.People) // here
        .WithMany(x => x.Templates)
        .Map(x => x.MapLeftKey("TemplateId")
            .MapRightKey("PersonId")
            .ToTable("TemplateCustomer")
        );


文章来源: Entity Framework Code First Many-to-Many relationship and inheritance