0%

dapper 自定义数据库字段和代码中Model字段不一致时候的mapping方法 - 不能失败 - 博客园

Excerpt

namespace YourNamespace{ /// /// Uses the Name value of the ColumnAttribute specified, otherwise maps as usual. /// /// The type of the …


复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<span>namespace</span><span> YourNamespace
{
</span><span>///</span> <span>&lt;summary&gt;</span>
<span>///</span><span> Uses the Name value of the ColumnAttribute specified, otherwise maps as usual.
</span><span>///</span> <span>&lt;/summary&gt;</span>
<span>///</span> <span>&lt;typeparam name="T"&gt;</span><span>The type of the object that this mapper applies to.</span><span>&lt;/typeparam&gt;</span>
<span>public</span> <span>class</span> ColumnAttributeTypeMapper&lt;T&gt;<span> : FallbackTypeMapper
{
</span><span>public</span><span> ColumnAttributeTypeMapper()
: </span><span>base</span>(<span>new</span><span> SqlMapper.ITypeMap[]
{
</span><span>new</span><span> CustomPropertyTypeMap(
</span><span>typeof</span><span>(T),
(type, columnName) </span>=&gt;<span>
type.GetProperties().FirstOrDefault(prop </span>=&gt;<span>
prop.GetCustomAttributes(</span><span>false</span><span>)
.OfType</span>&lt;ColumnMappingAttribute&gt;<span>()
.Any(attr </span>=&gt; attr.Name ==<span> columnName)
)
),
</span><span>new</span> DefaultTypeMap(<span>typeof</span><span>(T))
})
{
}
}

[AttributeUsage(AttributeTargets.Property, AllowMultiple </span>= <span>true</span><span>)]
</span><span>public</span> <span>class</span><span> ColumnMappingAttribute : Attribute
{
</span><span>public</span> <span>string</span> Name { <span>get</span>; <span>set</span><span>; }
}

</span><span>public</span> <span>class</span><span> FallbackTypeMapper : SqlMapper.ITypeMap
{
</span><span>private</span> <span>readonly</span> IEnumerable&lt;SqlMapper.ITypeMap&gt;<span> _mappers;

</span><span>public</span> FallbackTypeMapper(IEnumerable&lt;SqlMapper.ITypeMap&gt;<span> mappers)
{
_mappers </span>=<span> mappers;
}


</span><span>public</span> ConstructorInfo FindConstructor(<span>string</span><span>[] names, Type[] types)
{
</span><span>foreach</span> (<span>var</span> mapper <span>in</span><span> _mappers)
{
</span><span>try</span><span>
{
ConstructorInfo result </span>=<span> mapper.FindConstructor(names, types);
</span><span>if</span> (result != <span>null</span><span>)
{
</span><span>return</span><span> result;
}
}
</span><span>catch</span><span> (NotImplementedException)
{
}
}
</span><span>return</span> <span>null</span><span>;
}

</span><span>public</span> SqlMapper.IMemberMap GetConstructorParameter(ConstructorInfo constructor, <span>string</span><span> columnName)
{
</span><span>foreach</span> (<span>var</span> mapper <span>in</span><span> _mappers)
{
</span><span>try</span><span>
{
</span><span>var</span> result =<span> mapper.GetConstructorParameter(constructor, columnName);
</span><span>if</span> (result != <span>null</span><span>)
{
</span><span>return</span><span> result;
}
}
</span><span>catch</span><span> (NotImplementedException)
{
}
}
</span><span>return</span> <span>null</span><span>;
}

</span><span>public</span> SqlMapper.IMemberMap GetMember(<span>string</span><span> columnName)
{
</span><span>foreach</span> (<span>var</span> mapper <span>in</span><span> _mappers)
{
</span><span>try</span><span>
{
</span><span>var</span> result =<span> mapper.GetMember(columnName);
</span><span>if</span> (result != <span>null</span><span>)
{
</span><span>return</span><span> result;
}
}
</span><span>catch</span><span> (NotImplementedException)
{
}
}
</span><span>return</span> <span>null</span><span>;
}
}

}</span>

复制代码

复制代码

1
2
3
4
5
6
7
8
<span>public</span> <span>static</span><span> IEnumerable LoadWithCustomMapping()
{
</span><span>using</span> (<span>var</span> conn =<span> OpenDBConnection())
{
Dapper.SqlMapper.SetTypeMap(</span><span>typeof</span>(MyArea), <span>new</span><span> ColumnAttributeTypeMapper());
</span><span>return</span> conn.Query(<span>"</span><span>SELECT TOP 10 CAID,CAName,En FROM CityArea</span><span>"</span><span>);
}
}</span>

复制代码

posted @ 2014-10-20 23:14  不能失败  阅读(7222)  评论()  编辑  收藏  举报