gpt4 book ai didi

c# - 操作失败: The relationship could not be changed because one or more of the foreign-key properties is non-nullable.

转载 作者:行者123 更新时间:2023-12-01 23:01:49 25 4
gpt4 key购买 nike

此问题可能看起来与其他类似问题重复。但我建议你读完这个问题,然后决定它是否与某些帖子重复???

我的数据库中有 6 个表,如下所示:

enter image description here

我已经在所有表中插入了一些记录。

现在,我正在尝试更新订单。

起初,我只是尝试按如下方式更新订单:

CurrentOrder.UpdateOrder(Order);

OrderClient 中的 UpdateOrder 方法如下所示:

public Order UpdateOrder(Order Order)
{
IOrderRepository OrderRepository = _DataRepositoryFactory.GetDataRepository<IOrderRepository>();

Order updatedEntity = null;

if (Order.OrderId == 0)
{
updatedEntity = OrderRepository.Add(Order);
}
else
{
updatedEntity = OrderRepository.Update(Order);
}

return updatedEntity;

}

在 OrderRepository 中:

protected override Order UpdateEntity(RateDifferenceContext entityContext, Order entity)
{
return (from e in entityContext.OrderSet
where e.OrderId == entity.OrderId
select e).FirstOrDefault();
}

然后在 DataRepositoryBase 类中我使用以下方法:

public T Update(T entity)
{
using (U entityContext = new U())
{
T existingEntity = UpdateEntity(entityContext, entity);
SimpleMapper.PropertyMap(entity, existingEntity);
entityContext.SaveChanges();
return existingEntity;
}
}

此时我收到一条错误消息:

Multiplicity constraint violated. The role '…' of the relationship '…' has multiplicity 1 or 0..1

因此,我认为我需要删除所有相关表中特定于该订单的记录。所以,我尝试了下面的代码:

using (var xaction = new TransactionScope())
{
foreach (OrderItemDetail orderItemDetail in OrderItemDetailClient.GetAllOrderItemDetails().Where(x => x.OrderId == NewOrder.OrderId))
{
OrderItemDetailClient.DeleteOrderItemDetail(orderItemDetail);
}

foreach (Dispatch dispatch in DispatchClient.GetAllDispatches().Where(x => x.OrderId == NewOrder.OrderId))
{
foreach (DispatchItemDetail dispatchItemDetail in DispatchItemDetailClient.GetAllDispatchItemDetails().Where(x => x.InvoiceId == dispatch.InvoiceId))
{
DispatchItemDetailClient.DeleteDispatchItemDetail(dispatchItemDetail);
}

DispatchClient.DeleteDispatch(dispatch);
}

OrderClient.UpdateOrder(NewOrder);

xaction.Complete();
}

现在,我收到另一个错误:

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.

我在最后一个代码块的下面提到的行中收到此错误:

DispatchClient.DeleteDispatch(dispatch);

最佳答案

您有两个不同的问题。我们没有足够的详细信息来为您提供具体的解决方案,但由于这些都是非常常见的 EF“陷阱”,我相信了解一下正在发生的事情很有值(value)。

第一个错误:

Multiplicity constraint violated. The role '…' of the relationship '…' has multiplicity 1 or 0..1

这意味着您的外键属性不匹配。在 EF 中,您经常会遇到相同的 SQL 关系在模型中以多种方式表示的情况。

例如,您的 Order 类可能包含 OrderItemDetails 的集合(使用 OrderItemDetail.OrderId 填充)。您的 OrderItemDetail 上也可能有一个 Order 属性,该属性是使用相同的外键填充的。如果这两个属性都标记为已更改,但新值不匹配,则 EF 不知道要保存到 OrderItemdetail.OrderId 字段的新值。在这种情况下它会抛出这个异常。如果 OrderItemDetail 具有 Order 属性和 OrderId 属性,也会出现同样的问题。

为了避免此问题,您必须非常小心修改哪些属性。使用属性映射器可能很危险,因为它们可能“意外”修改错误的属性并导致许多此类问题。我们需要了解 SimpleMapper 是如何工作的,或者如何配置该映射来真正排除故障。

第二个错误:

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.

此错误通常意味着您并未真正删除对象。您正在从关系集合中删除该对象,这只是将外键设置为 null。

继续上面的示例,如果您调用 myOrder.OrderItemDetails.Remove(detail) 然后调用 SaveChanges,您可能认为它只会从数据库中删除 OrderItemDetail 记录,但这实际上并不是您告诉它执行的操作。您已将其从与 myOrder 关联的订单商品详细信息列表中删除。为了实现此目的,EF 生成一个 UPDATE 语句,该语句将 OrderId 列设置为 null。如果没有有关您的模型和 DeleteDispatch 方法中的代码的更多详细信息,很难确切知道问题出在哪里,但异常意味着它试图将该外键属性设置为 null 并失败,因为它不可为 null。

“修复”是直接从 Context 集合中删除项目,而不是从相关项目集合中删除项目。 IE。您应该调用 context.OrderItemDetails.Remove,而不是 myOrder.OrderItemDetails.Remove。这会真正删除该记录。

关于c# - 操作失败: The relationship could not be changed because one or more of the foreign-key properties is non-nullable.,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38105852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com