C# 有没有一种方法可以通过Dapper读取并保存为单个操作?

C# 有没有一种方法可以通过Dapper读取并保存为单个操作?,c#,sql-server,dapper,C#,Sql Server,Dapper,我有一个ASP.NET核心项目,其中的一个要求是每个人都可以有很多产品,但只有一个类型为“车”。因此,当我使用“汽车”类型保存新报价时,我会做如下操作: var products = productsRepository.GetClientProducts(); if (!products.Any(x => x.Type == "CAR")) { productsRepository.Add(productWithTypeNew); } 但如果有人在我的支票和储蓄之间加上新的“汽

我有一个ASP.NET核心项目,其中的一个要求是每个人都可以有很多产品,但只有一个类型为“车”。因此,当我使用“汽车”类型保存新报价时,我会做如下操作:

var products = productsRepository.GetClientProducts();
if (!products.Any(x => x.Type == "CAR"))
{
    productsRepository.Add(productWithTypeNew);
}

但如果有人在我的支票和储蓄之间加上新的“汽车”优惠怎么办?我将添加另一个,我的数据库将被破坏。

如果不太可能的话,也会被发现。这就是为什么数据库服务器有约束的概念。因此,在SQL Server术语中,您应该设计Products表,以便Type列具有唯一或主键约束。然后,如果写入记录时违反了异常,您将处理该异常。

在处理此要求时,会想到一些选项。第一个(设置约束并捕获罕见的异常)已经由Alan B在上面的回答中提到。我们都在猜测您的数据库模式,但我怀疑您可能需要一个适当的方法来设置约束

如果您的ORM框架支持,另一个选项是将事务传递给每个方法。“Raw”Dapper当然支持这一点,但从上面的代码来看,似乎还涉及到另一层抽象


最后一个选择,也可能是我将采用的方法,是将逻辑(启动事务、检查记录、添加记录)包装到存储过程中,然后在存储库中创建一个方法,直接调用该方法。在您的情况下,ORM可能会妨碍您。

您可以使用DB约束,也可以使用互斥。这是否简洁?这看起来更像实体框架。通常,使用Dapper,您可以编写自己的SQL语句,而不是让c#库为您生成SQL。@gunr2171他们使用的是一个可能使用Dapper的存储库。@gunr2171有相当多的框架围绕Dapper“SimpleCRUD”展开。它看起来确实像EF,但仍然很简洁。旁注:如果添加多行会破坏数据库,那么您的数据库设计可以做一些工作。在表上放置一个唯一的约束以防止多个条目。但是如何创建只允许使用Type=“CAR”添加一行的约束呢?嗯,您需要能够更改您的数据库架构。如果您可以在TSQL中添加一个唯一的约束,它将遵循以下原则:ALTER TABLE Products add constraint unique_type unique(类型)。一旦您这样做,在数据库级别就不可能在type列中添加一个具有重复值的行。请注意,您可以在类型中添加一个空值行,这是唯一约束与主键约束不同的一种方式。但这在客户端很容易陷入陷阱。