SQL事务如何工作?我使用SQL的时间不长,但我想我明白,通过将SQL语句包装在一个事务中,所有语句要么完成,要么不完成。这是我的问题。我有一个带有lineitem集合的订单对象。行项目与订单相关。订单号。我已验证所有ID均已设置且正确,但是当我尝试保存(插入)我获得的订单时,INSERT语句与FOREIGNKEY约束“FK_OrderItemDetail_Order”冲突。冲突发生在数据库“MyData”、表“dbo.Order”、列“OrderId”中。伪代码:创建交易transaction.Begin()InsertorderInsertorder.LineItems<--Anerroroccurredheretransaction.Commit实际代码:...entity.Validate();如果(实体。IsValid){SetChangedProperties(实体);实体.Install.NagsInstallHours=entity.TotalNagsHours;foreach(在entity.OrderItemDetailCollection中的OrderItemDetailorderItemDetail){SetChangedOrderItemDetailProperties(orderItemDetail);}ValidateRequiredProperties(实体);TransactionManagertransactionManager=DataRepository.Provider.CreateTransaction();EntityStateoriginalEntityState=entity.EntityState;尝试{entity.OrderVehicle.OrderId=entity.OrderId;entity.Install.OrderId=entity.OrderId;transactionManager.BeginTransaction();SaveInsuranceInformation(交易管理器,实体);DataRepository.OrderProvider.Save(transactionManager,entity);DataRepository.OrderItemDetailProvider。保存(transactionManager,entity.OrderItemDetailCollection);如果(!entity.OrderVehicle.IsEmpty){DataRepository.OrderVehicleProvider.Save(transactionManager,entity.OrderVehicle);}transactionManager.Commit();}catch{if(transactionManager.IsOpen){transactionManager.Rollback();}entity.EntityState=originalEntityState;}}...有人建议我需要使用两个事务,一个用于订单,一个用于订单项,但我有理由相信这是错误的,但我已经打败了一天它已经一天了我需要修复它以便继续前进,即使这意味着使用糟糕的工作。有没有可能我只是在做一些愚蠢的事情?我注意到您说您使用NetTiers进行代码生成。我自己使用过NetTiers,发现如果从表中删除外键约束,将其添加回同一个表,然后在对数据库进行更改后再次运行NetTiers的构建脚本,可能有助于重置数据访问层。我偶尔尝试过这种方法并取得积极成果。祝你好运。没有看到您的代码,很难说出问题所在。它可以是任何数量的东西,但看看这些:这很明显,但是你的两个插入命令在同一个连接上(并且连接始终保持打开状态)拥有事务对吗?您是否在第一次插入后检索与约束关联的ID,并在执行命令之前将其写回数据以进行第二次插入?DB中可以设置错误约束。您绝对不想使用两个事务。看起来您的lineItems插入语句没有正确设置order的值。这应该是Insertorder步骤的结果。您是否看过(并测试过)各个SQL语句?我认为您的问题与事务控制无关。我对此没有任何经验,但看起来您可能指定了父表中不可用的键值。对不起,但我帮不了你。问题是你如何处理错误。当发生错误时,事务不会自动回滚。您当然可以(并且可能应该)选择这样做,但是根据您的申请或您所在的位置,您可能仍想提交它。在这种情况下,这正是您正在做的。您需要在其中包装一些错误处理代码,以便在发生错误时可以回滚代码。该错误看起来像LineItem没有被赋予正确的FKOrderId,它是通过将订单插入订单表而自动生成的。你说你查了ID,你有没有查订单明细里的FK?以上就是C#学习教程:SQL事务如何工作?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
