小编典典

SQL事务如何工作?

sql

我从事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;
    }
}
...

有人建议我需要使用两项交易,一项用于订单,一项用于订单项,但我可以肯定地说这是错误的。但是我已经为此奋斗了整整一天,我需要解决它,这样我就可以继续进行下去,即使那意味着要做一些不好的工作。我可能只是在做一些愚蠢的事情吗?


阅读 171

收藏
2021-04-28

共1个答案

小编典典

我注意到您说您正在使用NetTiers进行代码生成。

我自己使用过NetTiers,发现如果您从表中删除外键约束,请将其重新添加到同一表中,然后在数据库中进行更改后再次运行NetTiers的构建脚本可能有助于重置数据访问权限层。我偶尔尝试过这种方法,但效果很好。

祝您好运。

2021-04-28