【问题标题】:EF 6: many-to-many self-reference: The DELETE statement conflicted with the REFERENCE constraintEF 6:多对多自引用:DELETE 语句与 REFERENCE 约束冲突
【发布时间】:2014-06-06 01:19:33
【问题描述】:

我有这个实体:

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”列中。 声明已终止。

你知道发生了什么吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 2011-04-16
      相关资源
      最近更新 更多