【发布时间】:2016-06-29 16:58:16
【问题描述】:
此问题可能与其他类似问题相似。但我建议您将问题阅读到最后,然后确定它是否与某些帖子重复?????
我的数据库中有 6 个表,如下所示:
我已经在所有表中插入了一些记录。
现在,我正在尝试更新订单。
起初,我只是尝试更新顺序如下:
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;
}
}
此时我收到一条错误消息:
违反了多重性约束。关系“…”的角色“…”的重数为 1 或 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();
}
现在,我收到另一个错误消息:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
我在最后一个代码块的下面提到的行中收到此错误:
DispatchClient.DeleteDispatch(dispatch);
【问题讨论】:
标签: c# entity-framework linq