为什么在代码首次创建的表中得到一个不需要的列

本文关键字:不需要 一个 代码 创建 为什么 | 更新日期: 2023-09-27 18:25:19

我不明白EF为什么在我的TemplateTaskDependancies表中创建一个可以为null的TemplateTask_Id列。我原以为使用modelbuilder配置类可以解决这个问题,但我一定遗漏了一些东西。

我的域类如下。

[Table("TemplateTaskDependancies")]
public class TemplateTaskDependancy : Dependancy<TemplateTask>,
                                      IDependancy<TemplateTask>
{
    [Column("TaskId")]
    public int TaskId { get; set; }
    [Column("NeededTaskId")]
    public int NeededTaskId { get; set; }
    [ForeignKey("TaskId")]
    public override TemplateTask Task { get; set; }
    [ForeignKey("NeededTaskId")]
    public override TemplateTask NeededTask { get; set; }
}
public abstract class Dependancy<T> : LoggedEntity
    where T : LoggedEntity
{
    [Column("TaskId")]
    public int TaskId { get; set; }
    [Column("NeededTaskId")]
    public int NeededTaskId { get; set; }
    [ForeignKey("TaskId")]
    public abstract T Task { get; set; }
    [ForeignKey("NeededTaskId")]
    public abstract T NeededTask { get; set; }
}
public interface IDependancy<T> where T : LoggedEntity
{        
    int Id { get; set; }        
    int TaskId { get; set; }
    int NeededTaskId { get; set; }
    T NeededTask { get; set; }
    T Task { get; set; }
    State { get; set; }
}
public abstract class LoggedEntity : IObjectWithState
{
     public int Id { get; set; }  // primary key
     // todo with Julie Lerman's repository pattern
}

在我的背景下,我有

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Conventions
               .Remove<OneToManyCascadeDeleteConvention>();
   modelBuilder.Configurations
               .Add(new TemplateTaskDependancyConfiguration());
}
public class TemplateTaskDependancyConfiguration :
             EntityTypeConfiguration<TemplateTaskDependancy>
{
    public TemplateTaskDependancyConfiguration()
    {
        HasRequired(x => x.NeededTask)
       .WithMany(y=>y.NeededTasks)
       .HasForeignKey(z=>z.NeededTaskId)
       .WillCascadeOnDelete(false);
        HasRequired(x => x.NeededTask)
       .WithMany(y => y.Dependancies)
       .HasForeignKey(z => z.TaskId)
       .WillCascadeOnDelete(false);
        HasRequired(x=>x.Task)
       .WithMany(y=>y.NeededTasks)
       .HasForeignKey(z=>z.NeededTaskId)
       .WillCascadeOnDelete(false);
        HasRequired(x => x.Task)
       .WithMany(y => y.Dependancies)
       .HasForeignKey(z => z.TaskId)
       .WillCascadeOnDelete(false);
    }
}

为什么在代码首次创建的表中得到一个不需要的列

因为您在任何地方都没有定义主键?

顺便说一句,这取决于Ency。

原来问题是由不需要的集合引起的

public List<TemplateTaskDependancy> Tasks

在我的TemplateTask类中。

即外键表包含额外的对象集合。