我知道我可以使用纯 dapper 来构建我的更新字符串,其中只包含我想要更新的属性(白名单)。
我想要的是保持 dapper 扩展的 ORM 风格:
con.Update<Person>(person);
我希望不更新人的某些属性(黑名单)
如何在运行 .Update 扩展方法时排除属性被更新?
您是否知道更好的 .Update 样式的 .Update 扩展?(那我不必
写下来 ;-)
我知道我可以使用纯 dapper 来构建我的更新字符串,其中只包含我想要更新的属性(白名单)。
我想要的是保持 dapper 扩展的 ORM 风格:
con.Update<Person>(person);
我希望不更新人的某些属性(黑名单)
如何在运行 .Update 扩展方法时排除属性被更新?
您是否知道更好的 .Update 样式的 .Update 扩展?(那我不必
写下来 ;-)
您可以尝试为此使用单独的类(例如, Person 的后代或使用忽略该属性的单独映射器围绕它的包装器)。
但这太丑陋了,不能成为一个好的解决方案。
DapperExtensions 目前对于除了明确的 CRUD 任务之外的任何事情都太简单了。我必须开发一个自定义映射器来添加 System.ComponentModel 注释支持,这对于 2015 年来说似乎很荒谬。
但是添加一个新的 UpdatePartial 扩展方法看起来是个好主意。
在相关类型的 ClassMapper 中,执行以下操作:
public MyTableMapper()
{
Table("MyTable");
Map(f => f.MyCalculatedField).ReadOnly();
}
只需定义一个PersonMapper
继承自ClassMapper<Person>
并用于Ignore()
映射要排除的列。
请参见下面的示例(来源:github 测试 Dapper Extensions),其中排除了Phones
属性 ( )。IEnumerable<Phone> Phones
using System;
using System.Collections.Generic;
using DapperExtensions.Mapper;
namespace DapperExtensions.Test.Data
{
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateCreated { get; set; }
public bool Active { get; set; }
public IEnumerable<Phone> Phones { get; private set; }
}
public class Phone
{
public int Id { get; set; }
public string Value { get; set; }
}
public class PersonMapper : ClassMapper<Person>
{
public PersonMapper()
{
Table("Person");
Map(m => m.Phones).Ignore();
AutoMap();
}
}
}