【问题标题】:EF TPT generating duplicate foreign keysEF TPT 生成重复的外键
【发布时间】:2015-03-29 08:09:12
【问题描述】:

我正在编写一个使用继承的应用程序,我正在尝试将其映射到具有 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),但它会将外键复制给每个用户(见图)。

提前致谢

【问题讨论】:

  • 尝试从 User 类中删除 AgendaAnswers 和 SolutionAnswers 属性。
  • 谢谢!这解决了问题。我想知道是否有办法保留两个子类集合

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


【解决方案1】:

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

如果您想将这些集合保留在 User 类中,您可能必须从 Answer 类中删除 UserUserId 属性,而是在 AgendaAnswerSolutionAnswer 中复制它们类。请参阅this SO question 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多