忽略仅在使用Dapper更新时的属性吗?

时间:2018-07-26 00:38:24

标签: c# dapper dapper-extensions

设置

作为数据访问层的一部分,我将Dapper与DapperExtensions结合使用,并用模型表示数据库实体。其中一些模型包含用于记录或更改跟踪的字段,例如:

public class ExampleClass : BaseModel, ITypeWithChangeTracking
{
    public int ExampleClassId { get { return Id; } set { Id = value; } }
    public DateTime CreatedDate { get; set; }
    public string CreatedBy { get; set; }

    // More properties
}

public class ExampleClassMapper : ClassMapper<ExampleClass>
{
    public ExampleClassMapper() : base()
    {
        Map(m => m.ExampleClassId).Key(KeyType.Identity);
        Map(m => m.Id).Ignore();
        base.AutoMap();
    }
}

在此示例中,BaseModel是一个抽象类,它指定模型具有一些整数ID(以使其更易于使用泛型); ITypeWithChangeTracking指定它应该具有更改跟踪字段。到目前为止,我已经能够将大多数DAL逻辑改组为可以在所有模型之间共享的通用实现,并且我希望与那些实现变更跟踪的功能保持同步。

使用的工具

C#

Dapper

DapperExtensions

问题

某些更改跟踪字段应在插入对象时设置,而不是在更新对象时设置。我在以可以在每种模型中重用的通用方式来实现这一点时遇到了麻烦。

问题

我可以与Dapper或DapperExtensions一起使用来指定应为插入插入字段,但为更新忽略字段吗?

我查看了诸如映射的ReadOnly和Ignore之类的各种属性,但是到目前为止,我发现的所有内容都是“总是包含”或“总是忽略”的总称。最好,我希望这可以与标准Update()函数一起使用,并且不需要专门的sproc,尽管我不确定这是否可行。我缺少任何漏洞或有用的装饰器吗?

(注意:如果有一种方法可以从头到尾通过ITypeWithChangeTracking接口改写此规范,则主要的布朗尼点!)


编辑:

我没有创建单独的模型,而是调整了已经从ITypeWithChangeTracking设置更改跟踪值的代码,以便它可以识别未设置的值(null,DateTime.Min等)。已经在检查记录是新记录还是以前存在的记录,因此,如果1)记录确实存在,并且2)模型未设置更改跟踪值,我就从现有记录中获取相关值。

1 个答案:

答案 0 :(得分:2)

正如我在评论中提到的,方法是为UPDATE创建单独的类,该类不包含您要忽略的UPDATE属性。您可能不需要每次都创建单独的类。您可以重用您的视图模型或类似模型。

其他解决方案是绕过Dapper Extensions退回到Dapper。有了这个,Dapper更加灵活了,您现在可以使用多个选项。您可以选择传递匿名对象或动态参数,以仅更新要更新的属性。

herehere已经进行了类似的讨论。