我从事SQL的时间不长,但是我想我知道,通过将SQL语句包装在事务中可以完成所有语句,或者没有一个完成。这是我的问题。我有一个具有lineitem集合的订单对象。订单项与order.OrderId相关。我已经验证 所有ID都已设置并且正确, 但是当我尝试保存(插入)订单时,我得到 的INSERT语句与FOREIGN KEY约束“FK_OrderItemDetail_Order”冲突。 在数据库“ MyData”的表“ dbo.Order”的列“ OrderId”中发生了冲突。
psuedo code:
create a transaction transaction.Begin() Insert order Insert order.LineItems <-- error occurs here transaction.Commit
actual code:
... entity.Validate(); if (entity.IsValid) { SetChangedProperties(entity); entity.Install.NagsInstallHours = entity.TotalNagsHours; foreach (OrderItemDetail orderItemDetail in entity.OrderItemDetailCollection) { SetChangedOrderItemDetailProperties(orderItemDetail); } ValidateRequiredProperties(entity); TransactionManager transactionManager = DataRepository.Provider.CreateTransaction(); EntityState originalEntityState = entity.EntityState; try { entity.OrderVehicle.OrderId = entity.OrderId; entity.Install.OrderId = entity.OrderId; transactionManager.BeginTransaction(); SaveInsuranceInformation(transactionManager, entity); DataRepository.OrderProvider.Save(transactionManager, entity); DataRepository.OrderItemDetailProvider.Save(transactionManager, entity.OrderItemDetailCollection); if (!entity.OrderVehicle.IsEmpty) { DataRepository.OrderVehicleProvider.Save(transactionManager, entity.OrderVehicle); } transactionManager.Commit(); } catch { if (transactionManager.IsOpen) { transactionManager.Rollback(); } entity.EntityState = originalEntityState; } } ...
有人建议我需要使用两项交易,一项用于订单,一项用于订单项,但我可以肯定地说这是错误的。但是我已经为此奋斗了整整一天,我需要解决它,这样我就可以继续进行下去,即使那意味着要做一些不好的工作。我可能只是在做一些愚蠢的事情吗?
我注意到您说您正在使用NetTiers进行代码生成。
我自己使用过NetTiers,发现如果您从表中删除外键约束,请将其重新添加到同一表中,然后在数据库中进行更改后再次运行NetTiers的构建脚本可能有助于重置数据访问权限层。我偶尔尝试过这种方法,但效果很好。
祝您好运。