【问题标题】:WillCascadeOnDelete throws "The relationship could not be changed..."WillCascadeOnDelete 抛出“无法更改关系......”
【发布时间】:2016-01-04 18:04:57
【问题描述】:

我有如下配置类

internal class OrderItemConfiguration : EntityTypeConfiguration<OrderItem>
{
    public OrderItemConfiguration()
    {
        ToTable("OrderItem");

        HasRequired<Order>(m => m.Order)
            .WithMany(q => q.OrderItems)
            .HasForeignKey(m => m.OrderId)
            .WillCascadeOnDelete();
    }
}

但是当我尝试删除订单时,它会抛出异常

操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当一个 对关系进行更改,相关的外键属性是 设置为空值。如果外键不支持空值, 必须定义一个新的关系,外键属性必须是 分配了另一个非空值,或者不相关的对象必须是 已删除。

我还注意到外键中的删除规则设置为Cascade

当我通过查询在 SSMS 中删除时,它会全部删除。

我在通用存储库类中的删除代码如下

    public virtual void Delete(TEntity entity)
    {
        DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
        if (dbEntityEntry.State != EntityState.Deleted)
        {
            dbEntityEntry.State = EntityState.Deleted;
        }
        else
        {
            DbSet.Attach(entity);
            DbSet.Remove(entity);
        }
    }

    public virtual void Delete(params object[] id)
    {
        var entity = GetById(id);
        if (entity == null) return;
        Delete(entity);
    }

【问题讨论】:

  • 看看这个也许有帮助:stackoverflow.com/questions/34038286/…
  • 此配置必须由数据库外键中的级联删除支持。此外,看看实际引发此错误的代码会很有趣。
  • 我遵循了代码优先的方法,正如我上面所说的,删除规则是外键的级联。当我明确删除所有孩子时,它正在删除而没有任何错误。

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


【解决方案1】:

我终于解决了。

请参阅以下线程以查看模式详细信息 Difference between DbSet.Remove and DbContext.Entry(entity).State = EntityState.Deleted

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2014-01-12
    • 2019-06-16
    相关资源
    最近更新 更多