EF 6:多对多自引用:DELETE语句与REFERENCE约束冲突

时间:2014-04-21 21:40:06

标签: c# entity-framework many-to-many entity-framework-6 self-reference

我有这个实体:

public class Course {
    public Course(){
        Postrequisites = new List<Course>();
        Prerequisites = new List<Course>();
    }
    public long Id { get; set; }
    public byte[] RowVersion { get; set; }
    // some other properties...
    public IList<Course> Postrequisites { get; set; }
    public IList<Course> Prerequisites { get; set; } 
}

具有多对多的自引用关系。这是我的配置:

public class CourseConfiguration : EntityTypeConfiguration<Course> {
    public CourseConfiguration() {
        // configurations for other properties...
        HasMany(t => t.Postrequisites)
            .WithMany(t => t.Prerequisites)
            .Map(t => {
                t.ToTable("CourseRequisites");
                t.MapLeftKey("PostrequisiteId");
                t.MapRightKey("PrerequisiteId");
            });
    }
}

当我尝试使用此方法删除项目时(请参阅方法Handle):

public class DeleteCommandHandlerBase {

    private readonly EntityContext _context;

    public DeleteCommandHandlerBase(EntityContext context) {
        _context = context;
    }

    protected virtual void Handle<TEntity>(long entityId) where TEntity : EntityBase, new() {
        var entity = _context.Set<TEntity>().Find(entityId);
        if (entity == null)
            throw new Exception(TextResources.ItemToDeleteNotFound);
        _context.Delete(entity); // see comment #1
        _context.SaveChanges();
    }
}

// comment #1
// _context.Delete is a custom method on my context which is:
public void Delete<TEntity>(TEntity entity) where TEntity : class {
    DbSet<TEntity> set = Set<TEntity>();
    if (Entry(entity).State == EntityState.Detached)
        set.Attach(entity);
    set.Remove(entity);
}

,我收到此错误:

  

更新条目时发生错误。有关详细信息,请参阅内部异常。

内在的例外是:

  

更新条目时发生错误。有关详细信息,请参阅内部异常。

内在的例外是:

  

DELETE语句与REFERENCE约束“FK_dbo.CourseRequisites_dbo.Courses_PostrequisiteId”冲突。冲突发生在数据库“MyDb”,表“dbo.CourseRequisites”,列'PostrequisiteId'中。   声明已经终止。

你知道发生了什么吗?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的错误。 找到了这个CASCADE Delete in many-to-many self-reference table

不幸的是,这不是解决方案。从本质上讲,这是一个数据库问题。首先需要删除关系条目,然后才能删除实体本身。

但由于我们都使用了Fluent API,我们无法访问关系表,至少我不知道如何。