gpt4 book ai didi

c# - 插入一个实体(如果它不存在)

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:21 26 4
gpt4 key购买 nike

我们一直在使用 DapperDapper.Contrib 来轻松执行常规数据库操作,这非常棒。但是,自从引入 Polly 为我们的某些操作添加重试策略后,我一直无法找到一种方法来保持同样的简单性,因为在执行之前必须检查记录是否存在重试。

这是我们当前如何执行插入的简化示例:

public async Task Insert(Payment payment)
{
var retryPolicy = // Create using Polly.
using (var connection = new SqlConnection(_connectionString))
{
var dao = MapToDao(payment);
await retryPolicy.ExecuteAsync(() => connection.InsertAsync(dao));
}
}

[Table("Payment")]
public class PaymentDao
{
[ExplicitKey]
public Guid PaymentId { get; set; }
// A whole bunch of properties omitted for brevity
}

其中 Payment 是我们的领域模型,PaymentDao 是我们的数据访问对象。

我们确实在调用 Insert 的服务中确实有逻辑来显式检查重复项,但这会被重试策略否定。这意味着自引入 Polly 以来,我们看到插入了少量重复付款。

我可以通过执行以下操作来解决此问题:

public async Task Insert(Payment payment)
{
var retryPolicy = // Create using Polly.
using (var connection = new SqlConnection(_connectionString))
{
var dao = MapToDao(payment);

await retryPolicy.ExecuteAsync(() => connection.ExecuteAsync(
@"IF ((SELECT COUNT(*) FROM dbo.Payment WHERE SubscriptionId = @subscriptionId) = 0)
BEGIN
INSERT INTO Payment
(
PaymentId,
SubscriptionId,
// Lots of columns omitted for brevity.
)
VALUES
(
@PaymentId,
@SubscriptionId,
// Lots of values omitted for brevity.
)
END",
new
{
dao.PaymentId,
dao.SubscriptionId,
// Lots of properties omitted for brevity.
}));
}
}

但是,如您所见,它变得非常冗长。有更简单的方法吗?

最佳答案

您可以考虑先使用模型检查然后执行插入的替代方案,因为搜索使用的参数较少

using (var connection = new SqlConnection(_connectionString)) {
var dao = MapToDao(payment);
var sql = "SELECT COUNT(1) FROM dbo.Payment WHERE SubscriptionId = @subscriptionId";
await retryPolicy.ExecuteAsync(async () => {
var exists = await connection.ExecuteScalarAsync<bool>(sql, new {dao.SubscriptionId});
if(!exists) {
await connection.InsertAsync(dao);
}
});
}

关于c# - 插入一个实体(如果它不存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49720797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com