C# 是否仅在使用Dapper更新时忽略属性? 安装程序

C# 是否仅在使用Dapper更新时忽略属性? 安装程序,c#,dapper,dapper-extensions,C#,Dapper,Dapper Extensions,作为数据访问层的一部分,我将Dapper与DapperExtensions结合使用,并用模型表示数据库实体。其中一些模型包含用于记录或更改跟踪的字段,如下所示: public class ExampleClass : BaseModel, ITypeWithChangeTracking { public int ExampleClassId { get { return Id; } set { Id = value; } } public DateTime CreatedDate

作为数据访问层的一部分,我将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();
    }
}
公共类ExampleClass:BaseModel,它的类型为ChangeTracking
{
public int ExampleClassId{get{return Id;}set{Id=value;}}
公共日期时间CreatedDate{get;set;}
通过{get;set;}创建的公共字符串
//更多属性
}
公共类示例ClassMapper:ClassMapper
{
public ExampleClassMapper():base()
{
Map(m=>m.ExampleClassId).Key(KeyType.Identity);
Map(m=>m.Id).Ignore();
base.AutoMap();
}
}
在本例中,BaseModel是一个抽象类,它指定模型具有一些整数Id(以便更容易使用泛型);ITypeWithChangeTracking指定它应该具有更改跟踪字段。到目前为止,我已经能够将大多数DAL逻辑混合到一个通用的实现中,该实现可以在所有模型之间共享,我希望与那些实现更改跟踪的模型保持一致

使用的工具 C#

整洁的

DapperExtensions

问题 某些更改跟踪字段应该在插入对象时设置,而不是在更新对象时设置。我很难以一种通用的方式实现它,这种方式可以对每个模型重用

问题: 我是否可以使用Dapper或DapperExtensions来指定插入时应包含字段,但更新时应忽略该字段

我已经研究了各种属性,例如映射的ReadOnly和Ignore,但到目前为止,我发现的所有属性都是一个“总是包含”或“总是忽略”。最好是,我希望使用标准的Update()函数,而不需要专门的存储过程,尽管我不确定这是否可行。我遗漏了什么漏洞或有用的装饰物

(注意:如果有办法将此规范一直拖到ITypeWithChangeTracking界面,那么主要的要点是!)


编辑:


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

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

另一个解决方案是,绕过短小的扩展,退回到短小。有了它,您现在可以有多种选择,因为Dapper更加灵活。您可以选择传递匿名对象或动态参数,以便仅更新要更新的属性

类似的讨论已经完成并正在进行