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

时间:2014-10-02 15:53:54

标签: c# entity-framework ef-code-first

我不明白为什么EF在我的TemplateTask_Id表中创建了一个可为空的TemplateTaskDependancies列。我认为使用模型构建器配置类可以解决问题,但我必须遗漏一些东西。

我的域名类如下。

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

2 个答案:

答案 0 :(得分:0)

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

顺便说一下,它的依赖性。

答案 1 :(得分:0)

事实证明,问题是由不必要的

集合引起的
public List<TemplateTaskDependancy> Tasks

在我的TemplateTask类中。

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