Mercurial > pub > bltoolkit
comparison Source/Reflection/MetadataProvider/LinqMetadataProvider.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Data.Linq.Mapping; | |
3 using System.Linq; | |
4 | |
5 namespace BLToolkit.Reflection.MetadataProvider | |
6 { | |
7 using DataAccess; | |
8 using Mapping; | |
9 using Extension; | |
10 | |
11 public class LinqMetadataProvider : MetadataProviderBase | |
12 { | |
13 #region Helpers | |
14 | |
15 private Type _type; | |
16 private bool? _isLinqObject; | |
17 readonly object _sync = new object(); | |
18 | |
19 void EnsureMapper(Type type) | |
20 { | |
21 if (_type != type) | |
22 { | |
23 _type = type; | |
24 _isLinqObject = null; | |
25 } | |
26 } | |
27 | |
28 bool IsLinqObject(Type type) | |
29 { | |
30 lock (_sync) | |
31 { | |
32 EnsureMapper(type); | |
33 | |
34 if (_isLinqObject == null) | |
35 { | |
36 var attrs = type.GetCustomAttributes(typeof(TableAttribute), true); | |
37 _isLinqObject = attrs.Length > 0; | |
38 } | |
39 | |
40 return _isLinqObject.Value; | |
41 } | |
42 } | |
43 | |
44 #endregion | |
45 | |
46 #region GetFieldName | |
47 | |
48 public override string GetFieldName(TypeExtension typeExtension, MemberAccessor member, out bool isSet) | |
49 { | |
50 if (IsLinqObject(member.TypeAccessor.Type)) | |
51 { | |
52 var a = member.GetAttribute<ColumnAttribute>(); | |
53 | |
54 if (a != null && !string.IsNullOrEmpty(a.Name)) | |
55 { | |
56 isSet = true; | |
57 return a.Name; | |
58 } | |
59 } | |
60 | |
61 return base.GetFieldName(typeExtension, member, out isSet); | |
62 } | |
63 | |
64 #endregion | |
65 | |
66 #region GetFieldStorage | |
67 | |
68 public override string GetFieldStorage(TypeExtension typeExtension, MemberAccessor member, out bool isSet) | |
69 { | |
70 if (IsLinqObject(member.TypeAccessor.Type)) | |
71 { | |
72 var a = member.GetAttribute<ColumnAttribute>(); | |
73 | |
74 if (a != null && !string.IsNullOrEmpty(a.Name)) | |
75 { | |
76 isSet = true; | |
77 return a.Storage; | |
78 } | |
79 } | |
80 | |
81 return base.GetFieldStorage(typeExtension, member, out isSet); | |
82 } | |
83 | |
84 #endregion | |
85 | |
86 #region GetInheritanceDiscriminator | |
87 | |
88 public override bool GetInheritanceDiscriminator(TypeExtension typeExtension, MemberAccessor member, out bool isSet) | |
89 { | |
90 if (IsLinqObject(member.TypeAccessor.Type)) | |
91 { | |
92 var a = member.GetAttribute<ColumnAttribute>(); | |
93 | |
94 if (a != null && !string.IsNullOrEmpty(a.Name)) | |
95 { | |
96 isSet = true; | |
97 return a.IsDiscriminator; | |
98 } | |
99 } | |
100 | |
101 return base.GetInheritanceDiscriminator(typeExtension, member, out isSet); | |
102 } | |
103 | |
104 #endregion | |
105 | |
106 #region GetMapIgnore | |
107 | |
108 public override bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet) | |
109 { | |
110 if (member.GetAttribute<AssociationAttribute>() != null) | |
111 { | |
112 isSet = true; | |
113 return true; | |
114 } | |
115 | |
116 if (IsLinqObject(member.TypeAccessor.Type)) | |
117 { | |
118 isSet = true; | |
119 return member.GetAttribute<ColumnAttribute>() == null; | |
120 } | |
121 | |
122 return base.GetMapIgnore(typeExtension, member, out isSet); | |
123 } | |
124 | |
125 #endregion | |
126 | |
127 #region GetNullable | |
128 | |
129 public override bool GetNullable(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet) | |
130 { | |
131 if (IsLinqObject(member.TypeAccessor.Type)) | |
132 { | |
133 var attr = member.GetAttribute<ColumnAttribute>(); | |
134 | |
135 if (attr != null) | |
136 { | |
137 isSet = true; | |
138 return attr.CanBeNull; | |
139 } | |
140 } | |
141 | |
142 return base.GetNullable(mappingSchema, typeExtension, member, out isSet); | |
143 } | |
144 | |
145 #endregion | |
146 | |
147 #region GetTableName | |
148 | |
149 public override string GetTableName(Type type, ExtensionList extensions, out bool isSet) | |
150 { | |
151 if (IsLinqObject(type)) | |
152 { | |
153 isSet = true; | |
154 | |
155 var attrs = type.GetCustomAttributes(typeof(TableAttribute), true); | |
156 | |
157 return ((TableAttribute)attrs[0]).Name; | |
158 } | |
159 | |
160 return base.GetTableName(type, extensions, out isSet); | |
161 } | |
162 | |
163 #endregion | |
164 | |
165 #region GetPrimaryKeyOrder | |
166 | |
167 public override int GetPrimaryKeyOrder(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet) | |
168 { | |
169 if (IsLinqObject(type)) | |
170 { | |
171 ColumnAttribute a = member.GetAttribute<ColumnAttribute>(); | |
172 | |
173 if (a != null && a.IsPrimaryKey) | |
174 { | |
175 isSet = true; | |
176 return 0; | |
177 } | |
178 } | |
179 | |
180 return base.GetPrimaryKeyOrder(type, typeExt, member, out isSet); | |
181 } | |
182 | |
183 #endregion | |
184 | |
185 #region GetNonUpdatableFlag | |
186 | |
187 public override NonUpdatableAttribute GetNonUpdatableAttribute(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet) | |
188 { | |
189 if (IsLinqObject(member.TypeAccessor.Type)) | |
190 { | |
191 var a = member.GetAttribute<ColumnAttribute>(); | |
192 | |
193 if (a != null) | |
194 { | |
195 isSet = true; | |
196 return a.IsDbGenerated ? new IdentityAttribute() : null; | |
197 } | |
198 } | |
199 | |
200 return base.GetNonUpdatableAttribute(type, typeExt, member, out isSet); | |
201 } | |
202 | |
203 #endregion | |
204 | |
205 #region GetAssociation | |
206 | |
207 public override Association GetAssociation(TypeExtension typeExtension, MemberAccessor member) | |
208 { | |
209 if (IsLinqObject(member.TypeAccessor.Type)) | |
210 { | |
211 var a = member.GetAttribute<System.Data.Linq.Mapping.AssociationAttribute>(); | |
212 | |
213 if (a != null) | |
214 return new Association(member, Association.ParseKeys(a.ThisKey), Association.ParseKeys(a.OtherKey), a.Storage, true); | |
215 } | |
216 | |
217 return base.GetAssociation(typeExtension, member); | |
218 } | |
219 | |
220 #endregion | |
221 | |
222 #region GetInheritanceMapping | |
223 | |
224 public override InheritanceMappingAttribute[] GetInheritanceMapping(Type type,TypeExtension typeExtension) | |
225 { | |
226 if (IsLinqObject(type)) | |
227 { | |
228 var attrs = type.GetCustomAttributes(typeof(InheritanceMappingAttribute), true); | |
229 | |
230 if (attrs.Length > 0) | |
231 return attrs.Select(a => (InheritanceMappingAttribute)a).ToArray(); | |
232 } | |
233 | |
234 return base.GetInheritanceMapping(type, typeExtension); | |
235 } | |
236 | |
237 #endregion | |
238 } | |
239 } |