3

在典型的一对多关系中,当我删除时:

var orderEntity = context.Orders.Single(o => o.orderID == entityID);
var baddetail = orderEntity.OrderDetails
                           .Single(od => od.orderDetailID == badOrderDetailID);
orderEntity.OrderDetails.Remove(baddetail);

我得到错误:

The operation failed: The relationship could not be changed because one 
or more of the foreign-key properties is non-nullable. When a change is made 
to a relationship, the related foreign-key property is set to a null value. 
If the foreign-key does not support null values, a new relationship must 
be defined, the foreign-key property must be assigned another non-null value, 
or the unrelated object must be deleted.

作为一种解决方案,提出了扩展 DBContext.SaveChanges()

public override int SaveChanges()
    {

        foreach (OrderDetails od in this.OrderDetails.ToList())
        {
            // Remove OrderDetails without Order.
            if (od.Order == null)
            {
                this.OrderDetail.Remove(od);
            }
        }

        return base.SaveChanges();
    }

但是正在检查带有空订单的 OrderDetails,当 orderID 不可为空时似乎很奇怪。这样做的正确方法是什么?

编辑: 例如,当您通过绑定Order.OrderDetails到和 DataGrid 公开时,会发生这种奇怪的删除。

4

2 回答 2

2

你可以这样做:

var orderEntity = context.Orders.Single(o => o.orderID == entityID);
var baddetail = orderEntity.OrderDetails.Single(od => od.orderDetailID == badOrderDetailID);
context.OrderDetails.Remove(baddetail);

因为在您的示例中,您没有删除实体。您正在删除关系。因此,它尝试将 null 设置为您的 FK 列,并且它不可为空,您将获得异常。

于 2012-04-29T21:38:53.863 回答
0

您正在从 OrderDetails 的 Order 对象集合中删除 OrderDetail。这只是将 OrderDetail 的 ID 有效地设置为 null,而不是将其标记为删除。这是不允许的,因为从 OrderDetail 到数据库中 Order 表的 FK 不可为空。

你应该做

var orderEntity = context.Orders.Single(o => o.orderID == entityID);
var baddetail = orderEntity.OrderDetails
                       .Single(od => od.orderDetailID == badOrderDetailID);

context.OrderDetails.Remove(baddetail);
于 2012-04-29T21:46:19.487 回答