3

典型的な1対多の関係では、次のように削除すると次のようになります。

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();
    }

しかし、orderIDがnull許容でない場合、OrdersがnullのOrderDetailsをチェックしているのは奇妙に思えます。これを行う適切な方法はどのようになっていますか?

編集: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);

あなたの例では、エンティティを削除していないためです。関係を削除しています。したがって、FK列にnullを設定しようとしますが、null可能ではない場合は、例外が発生します。

于 2012-04-29T21:38:53.863 に答える
0

OrderDetailsのOrderのオブジェクトコレクションからOrderDetailを削除します。これは、OrderDetailのIDを事実上nullに設定し、削除のマークを付けないだけです。OrderDetailからデータベース内のOrderテーブルへのFKはnull可能ではないため、これは許可されていません。

あなたがしている必要があります

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 に答える