Dapper UpdateAsync 忽略列

13

我正在尝试使用Dapper.Contrib更新这个表:

public class MyTable
{
    public int ID { get; set; }
    public int SomeColumn1 { get; set; }
    public int SomeColumn2 { get; set; }
    public int CreateUserID { get; set; }
    public int UpdateUserID { get; set; }
}

我不希望更新CreateUserID列,因为它是一种更新方法,所以在调用Dapper-Update.Async(entity)方法时,我想忽略此列。

我尝试过使用[NotMapped]和[UpdateIgnore]属性,但没有帮助。

注意:我仍然希望在插入操作时传递此列,因此[Computed]和[Write(false)]不合适。

有人能帮我找出如何在更新数据库中的表时忽略此列吗?


1
如果您正在使用存储库模式或任何相似的模式(并且应该将代码与具体实现解耦),则可以简单地覆盖“Update”并使用自己的逻辑。 - Abdo
3个回答

3

很抱歉,这不被支持。这里有相关的问题,只有在Dapper v2中才期望有解决方案。您也可以检查源代码(非常简单),并查看更新属性的搜索方式:

 var allProperties = TypePropertiesCache(type);
 keyProperties.AddRange(explicitKeyProperties);
 var computedProperties = ComputedPropertiesCache(type);
 var nonIdProps = allProperties.Except(keyProperties.Union(computedProperties)).ToList();

所有未标记为 Key\ExplicitKey\Computed 的并且可写的属性都会被包含。对于 InsertAsync,也会发生同样的情况(不过带有 ExplicitKey 属性的属性也会包含在插入中,但在您的情况下无法使用此属性,因为您的属性毕竟不是关键字)。因此,您必须等待此功能实现,分叉并自己实现,或编写自己的 UpdateAsync 方法。您可以从源代码中看出,这很简单,不难重新实现。

2
正如@Evk在他的回答中提到的那样,目前还没有解决方案。他也提到了一些解决方法。
除此之外,你可以选择直接使用Dapper(IDbConnection.Execute(...))来绕过Dapper.Contrib处理这个特定情况。
我曾经遇到过类似的问题(不过是与DapperExtensions有关),需要更新特定列和其他复杂查询,DapperExtensions要么根本无法生成,要么需要大量的工作才能实现。
对于那种特殊情况,我使用Dapper而不是DapperExtensions;项目的其他部分仍然可以从DapperExtensions中受益。这是一种权衡。这种情况非常有限。我发现这比调整/强制DapperExtensions更好。这也节省了我的时间和精力。

1
我建议使用[Computed]属性。

[Computed] - 此属性是计算属性,不应该成为更新的一部分。

但是,Dapper.Contrib的文档措辞似乎令人困惑。在插入时,[Computed]属性似乎被忽略了 - 这可能适用于您的用例,也可能不适用。

2
我之前已经尝试过了,但是它在插入操作上不起作用,因为它会忽略它。我只需要在更新时忽略它。 - Misha Zaslavsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接