使用Dapper进行映射时,自动从列中修剪空白

本文关键字:空白 修剪 Dapper 映射 使用 | 更新日期: 2023-09-27 18:26:38

我正在使用Dapper访问一个遗留数据库,列上有空白填充。

我发现的解决方案是添加属性,如:

private string _status;
public string status 
{
    get { return _status; }
    set { _status = value.Trim(); }
}

显然,对于将与该数据库交互的每个模型的每个字符串成员来说,这样做是乏味的。根据SET ANSI_PADDING上的MSDN条目,将其修改为OFF也不是一个选项。

由于数据库不是我的,我无法将其更改为nvarchar或simiar。

有没有一种简单的方法可以强制Dapper修剪它从数据库中读取的每个字符串列?

使用Dapper进行映射时,自动从列中修剪空白

看看Dapper.Contrib。如果是接口类型,Get方法可以在每个返回的实例上生成一个更改跟踪代理。

(来自Get方法的注释)

通过表"Ts"中的单个id返回单个实体。T必须是接口类型。Id必须标记有[Key]属性。创建的实体会被跟踪/截获以进行更改,并由Update()扩展使用。

您可以修改CreateProperty方法来实现Trim逻辑

一种方法是编写一个扩展方法,并使用反射来修剪类上的所有字符串属性。例如:
public static class ObjExt
{
    public static void Trim<T>(this T item)
    {
        var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var p in properties)
        {
            if (p.PropertyType != typeof(string) || !p.CanWrite || !p.CanRead) { continue; }
            var value = p.GetValue(item) as string;
            p.SetValue(item,value.Trim());
        }
    }
}