将TransactionScope与ASP.NET Core 6 Web API和系统,Data.SQLite

rur96b6h  于 2023-04-30  发布在  SQLite
关注(0)|答案(1)|浏览(176)

该应用程序是一个ASP。NET Core 6 Web API。它使用SQLite作为数据库。我们的目标是有一天将其迁移到SQL Server,因此我试图严格控制数据库层。
它的独特之处在于它需要多个SQLite数据库,一个用于系统,一个用于当前的“事件”。系统永远不会改变,但是根据事件数据库的配置方式(可能在调用Web API之间发生变化),事件数据库可能会发生变化。
DB层有一个_databaseService,它将创建连接:

public DbConnection CreateConnection()
{
    var connection = DbFactory.CreateConnection();

    if (connection != null)
    {
        connection.ConnectionString = ConnectionString;
        connection.Open();
        return connection;
    }

    return null;
}

DB层使用如下:

public int UpdateInvoiceItem(int priceListItemId, int qty, int invoiceItemId)
{
    const string sql = "update INVOICE_ITEM set PRICE_LIST_ITEM_ID = @priceListItemId, QTY = @qty where INVOICE_ITEM_ID =  @invoiceItemId";

    using var conn = _databaseService.GetEventDbHelper().CreateConnection();

    return conn.Execute(sql, new { priceListItemId, qty, invoiceItemId });
}

一切都很好,直到我尝试将其 Package 到业务层的TransactionScope上一层:

public void UpdateInvoice(Invoice invoice)
{
    using var transactionScope = new TransactionScope();

    foreach (var invoiceItem in invoice.InvoiceItems)
    {
        if (invoiceItem.Qty == 0)
        {
            _invoiceDs.RemoveInvoiceItem(invoiceItem.InvoiceItemId);
        }
        else if (invoiceItem.OrgQty != invoiceItem.Qty ||
                 invoiceItem.OrgPriceListItemId != invoiceItem.PriceListItemId)
        {
            _invoiceDs.UpdateInvoiceItem(invoiceItem.PriceListItemId, invoiceItem.Qty,
                invoiceItem.PriceListItemId);
        }
    }

    transactionScope.Complete();
}

第一次调用_invoiceDs.UpdateInvoiceItem时一切正常,但第二次调用时它从未返回,我假设这是因为事务的原因。
我应该做什么,以便每次获得连接时它都是TransactionScope的一部分?DB层(UpdateInvoiceItem)是否应该获得连接并在类的生命周期(设置为scoped)中保留它?我是不是应该采取一种完全不同的方法?

jgovgodb

jgovgodb1#

假设UpdateInvoiceItem将在UpdateInvoice中被调用多次,在UpdateInvoiceItem方法中真的让我很惊讶。

using var conn = _databaseService.GetEventDbHelper().CreateConnection();

首先你应该了解TransactionScope的概念,如果你能使用_context,你的代码可能会更干净。您可以参考repo

相关问题