gpt4 book ai didi

asp.net-mvc-4 - Entity Framework 代码优先多对多关系和继承

转载 作者:行者123 更新时间:2023-12-04 13:27:54 26 4
gpt4 key购买 nike

如果这个问题在某处得到了解答,请原谅我,我一直很难找到解决该问题的方法。

我正在尝试在MVC4项目上设置EF Code First。我有一个用户和客户都继承自Person。然后,我有了一个Template对象,该对象与Customer具有多对多关系,与User具有一对多关系。这是我的设置方法:

模型

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; }
}

语境
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")
);
}
}

如果我从上下文中删除Person DBSet,则可以正常工作,但可以设置TPT继承。我想使用TPH继承,但是当我在上下文中使用Person DBSet启用迁移时,它会阻塞:

NavigationProperty"template"无效。关联类型'MvcProject.Models.Template_Customers'中FromRole'Template_Customers_Target'的类型'MvcProject.Models.Customer'必须与声明了该NavigationProperty的类型'MvcProject.Models.Person'完全匹配。

我在哪里错了?

最佳答案

您不能从基础实体继承导航属性。必须始终在关系的另一端引用的类中声明它们。

  • 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; }
    }

    然后,您可以使用Fluent 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);

    关于asp.net-mvc-4 - Entity Framework 代码优先多对多关系和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15662145/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com