annotate Extensions/JointureAddOn/Mapping/FullObjectMapper.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 #region
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.DataAccess;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using BLToolkit.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using BLToolkit.Reflection.Extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 namespace BLToolkit.Mapping
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 public class FullObjectMapper : ObjectMapper, IObjectMapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 #region Fields
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 private static readonly object SetterHandlersLock = new object();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 private static readonly Dictionary<Type, Dictionary<string, SetHandler>> SettersHandlers =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 new Dictionary<Type, Dictionary<string, SetHandler>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 private static readonly Dictionary<Type, Dictionary<string, GetHandler>> GettersHandlers =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 new Dictionary<Type, Dictionary<string, GetHandler>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 private readonly DbManager _db;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 private readonly FactoryType _factoryType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 private readonly bool _ignoreLazyLoad;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 public FullObjectMapper(DbManager db, bool ignoreLazyLoading, FactoryType factoryType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 _db = db;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 _ignoreLazyLoad = ignoreLazyLoading;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 _factoryType = factoryType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 PropertiesMapping = new List<IMapper>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 PrimaryKeyValueGetters = new List<GetHandler>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 PrimaryKeyNames = new List<string>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 #region IPropertiesMapping Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 public List<IMapper> PropertiesMapping { get; private set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 public IPropertiesMapping ParentMapping { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 public bool IsNullable { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 public bool ColParent { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 #region IMapper Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 public int DataReaderIndex { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 public SetHandler Setter { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 public Type PropertyType { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 public string PropertyName { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 public Association Association { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 #region IObjectMapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 public bool IsLazy { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 public bool ContainsLazyChild { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 public GetHandler Getter { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 public List<string> PrimaryKeyNames { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 #region ILazyMapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 public GetHandler ParentKeyGetter { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 public List<GetHandler> PrimaryKeyValueGetters { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 #region Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 public override void Init(MappingSchema mappingSchema, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 PropertyType = type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 // TODO implement this method
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 base.Init(mappingSchema, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 int startIndex = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 GetObjectMapper(this, ref startIndex, _typeAccessor);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 public override object CreateInstance()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 object result = ContainsLazyChild
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 ? (_factoryType == FactoryType.LazyLoading
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 ? TypeFactory.LazyLoading.Create(PropertyType, this, LoadLazy)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 : TypeFactory.LazyLoadingWithDataBinding.Create(PropertyType, this, LoadLazy))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 : FunctionFactory.Remote.CreateInstance(PropertyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 return result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 public override object CreateInstance(InitContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 return CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 #region Private methods
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 private TableDescription GetTableDescription(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 var tableDescription = new TableDescription();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 object[] tableAtt = type.GetCustomAttributes(typeof (TableNameAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 if (tableAtt.Length > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 var tna = (TableNameAttribute) tableAtt[0];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 tableDescription.Database = tna.Database;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 tableDescription.Owner = tna.Owner;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 tableDescription.TableName = tna.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 return tableDescription;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 private IMapper GetObjectMapper(IObjectMapper mapper, ref int startIndex, TypeAccessor akTypeAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 //Todo: Remove this Call!
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 _extension = TypeExtension.GetTypeExtension(mapper.PropertyType /*_typeAccessor.OriginalType*/, MappingSchema.Extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 Type mapperType = mapper.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 var objectMappers = new List<IObjectMapper>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 TableDescription tableDescription = GetTableDescription(mapperType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 lock (SetterHandlersLock)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 if (!SettersHandlers.ContainsKey(mapperType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 SettersHandlers.Add(mapperType, new Dictionary<string, SetHandler>());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 if (!GettersHandlers.ContainsKey(mapperType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 GettersHandlers.Add(mapperType, new Dictionary<string, GetHandler>());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 PropertyInfo[] properties = mapperType.GetProperties();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 MemberAccessor primaryKeyMemberAccessor = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 foreach (MemberAccessor ma in akTypeAccessor)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 // Setters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 lock (SetterHandlersLock)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 if (!SettersHandlers[mapper.PropertyType].ContainsKey(ma.Name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 SettersHandlers[mapper.PropertyType].Add(ma.Name, ma.SetValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 if (GetPrimaryKey(ma) != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 primaryKeyMemberAccessor = ma;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 lock (SetterHandlersLock)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 if (!GettersHandlers[mapperType].ContainsKey(ma.Name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 GettersHandlers[mapperType].Add(ma.Name, ma.GetValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 mapper.PrimaryKeyValueGetters.Add(GettersHandlers[mapperType][ma.Name]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 mapper.PrimaryKeyNames.Add(ma.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 if (mapper.Association != null && (mapper.Association.OtherKey == null || mapper.Association.OtherKey.Length == 0))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 mapper.Association.OtherKey = new[] {ma.Name};
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 if (primaryKeyMemberAccessor == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 throw new Exception("PrimaryKey attribute not found on type: " + mapperType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 foreach (PropertyInfo prop in properties)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 var ma = akTypeAccessor.First(x => x.Name == prop.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 // Check if the accessor is an association
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 var association = GetAssociation(ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 if (association != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 // Getters for IObjectMapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 lock (SetterHandlersLock)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 if (!GettersHandlers[mapperType].ContainsKey(prop.Name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 GettersHandlers[mapperType].Add(prop.Name, ma.GetValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 bool isCollection = prop.PropertyType.GetInterfaces().ToList().Contains(typeof (IList));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 IObjectMapper propertiesMapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 if (!isCollection)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 // TODO Generate this instance using the CreateObjectMapperInstance method of fullMappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 // _db.MappingSchema.CreateObjectMapperInstance(prop.PropertyType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 propertiesMapping = new FullObjectMapper(_db, _ignoreLazyLoad, _factoryType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 PropertyType = prop.PropertyType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 IsNullable = association.CanBeNull,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 Getter = GettersHandlers[mapperType][prop.Name],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 Type listElementType = GetGenericType(prop.PropertyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 TableDescription colElementTableDescription = GetTableDescription(listElementType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 // TODO Generate this instance using the CreateObjectMapperInstance method of fullMappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 propertiesMapping = new CollectionFullObjectMapper(_db, _factoryType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 PropertyType = listElementType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 Getter = GettersHandlers[mapperType][prop.Name],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 TableName = colElementTableDescription.TableName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 PropertyCollectionType = prop.PropertyType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 if (mapper is FullObjectMapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 ((FullObjectMapper) mapper).ColParent = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 if (association.ThisKey == null || association.ThisKey.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 association.ThisKey = new[] {primaryKeyMemberAccessor.Name};
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 bool isLazy = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 if (!_ignoreLazyLoad)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 var lazy = GetLazyInstance(ma); // prop.GetCustomAttributes(typeof(LazyInstanceAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 if (lazy)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 isLazy = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 mapper.ContainsLazyChild = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 // Getters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 lock (SetterHandlersLock)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 if (!GettersHandlers[mapperType].ContainsKey(primaryKeyMemberAccessor.Name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 GettersHandlers[mapperType].Add(primaryKeyMemberAccessor.Name, primaryKeyMemberAccessor.GetValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 propertiesMapping.Association = association;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 propertiesMapping.PropertyName = prop.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 propertiesMapping.IsLazy = isLazy;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 propertiesMapping.Setter = SettersHandlers[mapperType][prop.Name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 if (propertiesMapping.IsLazy)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 propertiesMapping.ParentKeyGetter = GettersHandlers[mapperType][primaryKeyMemberAccessor.Name];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 objectMappers.Add(propertiesMapping);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 var mapIgnore = GetMapIgnore(ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 if (mapIgnore)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 var mapField = GetMapField(ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 string columnName = mapField != null ? mapField.MapName : prop.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 var map = new ValueMapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 PropertyName = prop.Name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 PropertyType = prop.PropertyType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 DataReaderIndex = startIndex,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 Setter = SettersHandlers[mapperType][prop.Name],
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 TableName = tableDescription.TableName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 ColumnName = columnName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 var mapColumnName = map.GetColumnName(columnName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 map.ColumnAlias = columnName == mapColumnName ? null : mapColumnName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 mapper.PropertiesMapping.Add(map);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 var pkField = GetPrimaryKey(ma);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 if (pkField != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 mapper.DataReaderIndex = startIndex;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 startIndex++;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 foreach (IObjectMapper objMap in objectMappers)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 #region Check mapping recursion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 IObjectMapper cel = mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 while (cel != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 if (mapper.PropertyType == objMap.PropertyType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 cel = (IObjectMapper) cel.ParentMapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 objMap.ParentMapping = mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 mapper.PropertiesMapping.Add(GetObjectMapper(objMap, ref startIndex, MappingSchema.GetObjectMapper(objMap.PropertyType).TypeAccessor));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 return mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 protected object LoadLazy(IMapper mapper, object proxy, Type parentType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 var lazyMapper = (ILazyMapper) mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 object key = lazyMapper.ParentKeyGetter(proxy);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 var fullSqlQuery = new FullSqlQuery(_db, ignoreLazyLoad: true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 object parentLoadFull = fullSqlQuery.SelectByKey(parentType, key);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 if (parentLoadFull == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 object value = Activator.CreateInstance(mapper is CollectionFullObjectMapper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 ? (mapper as CollectionFullObjectMapper).PropertyCollectionType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 : mapper.PropertyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 return value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 var objectMapper = (IObjectMapper) mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 return objectMapper.Getter(parentLoadFull);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 private static Type GetGenericType(Type t)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 if (t.IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 Type[] at = t.GetGenericArguments();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 return at.FirstOrDefault();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 }