【发布时间】: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