Dapper UpdateAsync忽略列

时间:2017-12-04 18:21:32

标签: c# dapper dapper-contrib

我正在尝试使用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)]不合适。

有人可以帮我弄清楚在更新数据库中的表时如何忽略此列吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

嗯,它不受支持。这里是相关的issue,只有在Dapper v2中才能得到解决方案。您还可以检查source code(这很简单),并查看更新的属性搜索如下:

 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方法。您可以从源代码中看到它非常简单并且不难重新实现。

答案 1 :(得分:2)

正如@Evk在他的回答中已经提到的那样,还没有实现解决方案。他还提到了解决方法。

除此之外,你可以选择使用Dapper(IDbConnection.Execute(...))直接绕过Dapper.Contrib来解决这个特殊情况。

我有一个类似的问题(尽管有DapperExtensions),特别是列更新和其他复杂的查询,DapperExtensions完全无法生成或需要很多工作来实现它。

我直接使用Dapper代替DapperExtensions用于该特定情况;项目的其他部分仍然受益于DapperExtensions。这就像踩踏。这种情况非常有限。我发现这是更好的解决方案,而不是为此调整/强制DapperExtensions。这也节省了我的时间和努力。

答案 2 :(得分:1)

我建议使用[Computed]属性。 Dapper.Contrib Readme.md