EF TPT生成重复的外键

时间:2015-03-29 08:09:13

标签: c# .net sql-server entity-framework

我正在编写一个使用继承的应用程序,我正在尝试将其映射到具有TPT结构的SQL Server数据库。

但是,由于某种原因,EF会在超类和子类表中生成重复的外键。

我有这些课程:

public abstract class Answer
{
    public int AnswerId { get; set; }
    [Required]
    [MaxLength(250, ErrorMessage = "The answer cannot contain more than 250 characters")]
    public String Text { get; set; }
    [Required]
    [MaxLength(1500, ErrorMessage = "The description cannot contain more than 1500 characters")]
    public String Description { get; set; }

    public User User { get; set; }
}

public class AgendaAnswer : Answer
{
    [Required]
    public AgendaModule AgendaModule { get; set; }
}

public class SolutionAnswer : Answer
{
    [Required]
    public SolutionModule SolutionModule { get; set; }
}

public abstract class Module
{
    // for some reason EF doesn't recognize this as primary key
    public int ModuleId { get; set; }
    [Required]
    public String Question { get; set; }
    public String Description { get; set; }
    [Required]
    public DateTime StartTime { get; set; }
    [Required]
    public DateTime EndTime { get; set; }

    public virtual IList<Tag> Tags { get; set; }
}

public class AgendaModule : Module
{
    public IList<AgendaAnswer> AgendaAnswers { get; set; }
}

public class SolutionModule : Module
{
    public IList<SolutionAnswer> SolutionAnswers { get; set; }
}

public class User
{
    public int UserId { get; set; }
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public int Zip { get; set; }
    public bool Active { get; set; }

    public virtual IList<AgendaAnswer> AgendaAnswers { get; set; }
    public virtual IList<SolutionAnswer> SolutionAnswers { get; set; }
}

这是我的DbContext类的内容:

public DbSet<AgendaModule> AgendaModules { get; set; }
public DbSet<SolutionModule> SolutionModules { get; set; }
public DbSet<AgendaAnswer> AgendaAnswers { get; set; }
public DbSet<SolutionAnswer> SolutionAnswers { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

    modelBuilder.Entity<Module>().HasKey(m => m.ModuleId);
    modelBuilder.Entity<Answer>().HasKey(a => a.AnswerId);

    modelBuilder.Entity<AgendaAnswer>().Map(m =>
    {
        m.ToTable("AgendaAnswers");
    });

    modelBuilder.Entity<SolutionAnswer>().Map(m =>
    {
        m.ToTable("SolutionAnswers");
    });
}

当我运行我的应用程序时,EF会根据我的需要创建表格(TPT),但它会复制每个用户的外键(见图片)。

enter image description here

提前致谢

1 个答案:

答案 0 :(得分:1)

正如我在上面的评论中所述,解决方案是从User类中删除AgendaAnswersSolutionAnswers属性。

如果您希望将这些集合保留在User课程中,则可能必须从User课程中删除UserIdAnswer属性,而是将其复制到AgendaAnswerSolutionAnswer个类。有关详细信息,请参阅this SO question