C# Dapper UpdateSync忽略列
我正在尝试使用Dapper进行更新。请更改此表:C# Dapper UpdateSync忽略列,c#,dapper,dapper-contrib,C#,Dapper,Dapper Contrib,我正在尝试使用Dapper进行更新。请更改此表: 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; } } 我
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)]不合适
有人能帮我找出在更新数据库中的表时如何忽略此列吗?我建议使用该属性
[Computed]
-此属性是计算的,不应作为更新的一部分
但是,Dapper.Contrib的文档似乎措词混乱。插入时,
[Computed]
属性似乎也被忽略-这可能适用于您的用例,也可能不适用于您的用例。好吧,它只是不受支持。这里是相关的,解决方案只在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
(insert中也包括带有ExplicitKey
的属性除外,但您不能在位置中使用此属性,因为您的属性毕竟不是键)
因此,您要么等待实现,要么自己动手实现,要么编写自己的
UpdateAsync
方法。您可以从源代码中看到它非常简单,并且不难重新实现。正如@Evk在他的回答中已经提到的,目前还没有实现任何解决方案。他还提到了解决办法
除此之外,对于这种特殊情况,您可以选择直接绕过Dapper.Contrib使用Dapper(IDbConnection.Execute(…)
)
对于特定的列更新和其他复杂的查询,DapperExtensions要么根本无法生成,要么需要做很多工作才能实现,我也遇到了类似的问题(尽管DapperExtensions)
对于那个特殊的情况,我直接使用简洁而不是简洁;项目的其他部分仍然受益于DapperExtensions。这就像是踩下。这种情况非常有限。我发现这是更好的解决方案,而不是为此调整/强制DapperExtensions。这也节省了我的时间和精力。我以前已经尝试过了,但它无法用于插入操作,因为它忽略了它。我只需要在更新时忽略它。如果您使用的是存储库模式/或任何关闭模式(并且您应该将代码与具体实现分离),您可以简单地覆盖
Update
,并使用您自己的逻辑。