该应用程序是一个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)中保留它?我是不是应该采取一种完全不同的方法?
1条答案
按热度按时间jgovgodb1#
假设UpdateInvoiceItem将在UpdateInvoice中被调用多次,在UpdateInvoiceItem方法中真的让我很惊讶。
首先你应该了解TransactionScope的概念,如果你能使用
_context
,你的代码可能会更干净。您可以参考repo。