annotate Source/Mapping/Fluent/FluentMap.cs @ 5:f7d63a092920

Исправлено условие Where в тех случаях, когда репозитарий не является генериком
author cin
date Tue, 10 Mar 2015 16:02:11 +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 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Linq.Expressions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.Data.DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using BLToolkit.Reflection.Extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 namespace BLToolkit.Mapping.Fluent
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 /// FluentSettings
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 /// <typeparam name="T"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 public partial class FluentMap<T>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 private readonly TypeExtension _typeExtension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 private List<IFluentMap> _childs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 private const string MemberNameSeparator = ".";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 /// ctor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 public FluentMap()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 : this(new TypeExtension { Name = typeof(T).FullName }, null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 { }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 /// ctor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 /// <param name="typeExtension"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 /// <param name="childs"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 protected FluentMap(TypeExtension typeExtension, List<IFluentMap> childs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 this._typeExtension = typeExtension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 this._childs = childs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 if (FluentConfig.MappingConfigurator.GetTableName != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 this.TableName(null, null, FluentConfig.MappingConfigurator.GetTableName(typeof(T)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 /// TableNameAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 /// <param name="name"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 public FluentMap<T> TableName(string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 return this.TableName(null, null, name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 /// TableNameAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 /// <param name="database"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 /// <param name="name"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 public FluentMap<T> TableName(string database, string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 return this.TableName(database, null, name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 /// TableNameAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 /// <param name="database"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 /// <param name="owner"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 /// <param name="name"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 public FluentMap<T> TableName(string database, string owner, string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 ((IFluentMap)this).TableName(database, owner, name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 /// MapFieldAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 /// <typeparam name="TR"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 /// <param name="isInheritanceDiscriminator"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 public MapFieldMap<T,TR> MapField<TR>(Expression<Func<T, TR>> prop, bool isInheritanceDiscriminator)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 return this.MapField(prop, null, null, isInheritanceDiscriminator);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 /// MapFieldAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 /// <typeparam name="TR"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 /// <param name="mapName"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 /// <param name="storage"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 /// <param name="isInheritanceDiscriminator"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 public MapFieldMap<T, TR> MapField<TR>(Expression<Func<T, TR>> prop, string mapName = null, string storage = null, bool? isInheritanceDiscriminator = null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 if (mapName == null && FluentConfig.MappingConfigurator.GetColumnName != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 mapName = FluentConfig.MappingConfigurator.GetColumnName(new MappedProperty { Name = name, Type = typeof(TR), ParentType = typeof(T) });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 ((IFluentMap)this).MapField(name, mapName, storage, isInheritanceDiscriminator);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 private void MapFieldOnType(string origName, string mapName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 AttributeExtensionCollection attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 if (!this._typeExtension.Attributes.TryGetValue(Attributes.MapField.Name, out attrs))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 attrs = new AttributeExtensionCollection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 this._typeExtension.Attributes.Add(Attributes.MapField.Name, attrs);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 var attributeExtension = new AttributeExtension();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 attributeExtension.Values.Add(Attributes.MapField.OrigName, origName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 attributeExtension.Values.Add(Attributes.MapField.MapName, mapName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 attrs.Add(attributeExtension);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 private void MapFieldOnField(string origName, string mapName, string storage, bool? isInheritanceDiscriminator)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 var member = this.GetMemberExtension(origName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 if (!string.IsNullOrEmpty(mapName))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 member.Attributes.Add(Attributes.MapField.Name, mapName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 if (null != storage)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 member.Attributes.Add(Attributes.MapField.Storage, storage);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 if (null != isInheritanceDiscriminator)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 member.Attributes.Add(Attributes.MapField.IsInheritanceDiscriminator, this.ToString(isInheritanceDiscriminator.Value));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 /// PrimaryKeyAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 /// <typeparam name="TR"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 /// <param name="order"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 public MapFieldMap<T, TR> PrimaryKey<TR>(Expression<Func<T, TR>> prop, int order = -1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 ((IFluentMap)this).PrimaryKey(name, order);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 /// NonUpdatableAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 public MapFieldMap<T, TR> NonUpdatable<TR>(Expression<Func<T, TR>> prop)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 ((IFluentMap)this).NonUpdatable(name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 /// IdentityAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 /// <typeparam name="TR"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 public MapFieldMap<T, TR> Identity<TR>(Expression<Func<T, TR>> prop)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 ((IFluentMap)this).Identity(name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 /// SqlIgnoreAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 /// <param name="ignore"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 public MapFieldMap<T, TR> SqlIgnore<TR>(Expression<Func<T, TR>> prop, bool ignore = true)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 ((IFluentMap)this).SqlIgnore(name, ignore);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 /// MapIgnoreAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 /// <param name="ignore"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 public MapFieldMap<T, TR> MapIgnore<TR>(Expression<Func<T, TR>> prop, bool ignore = true)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 ((IFluentMap)this).MapIgnore(name, ignore);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 /// TrimmableAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 public MapFieldMap<T, TR> Trimmable<TR>(Expression<Func<T, TR>> prop)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 ((IFluentMap)this).Trimmable(name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 /// MapValueAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 /// <typeparam name="TV"> </typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 /// <typeparam name="TR"> </typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 /// <param name="origValue"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 /// <param name="value"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 /// <param name="values"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 public MapFieldMap<T, TR> MapValue<TV, TR>(Expression<Func<T, TR>> prop, TR origValue, TV value, params TV[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 ((IFluentMap)this).MapValue(name, origValue, value, values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 /// DefaultValueAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 /// <param name="prop"> </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 /// <param name="value"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 public MapFieldMap<T, TR> DefaultValue<TR>(Expression<Func<T, TR>> prop, TR value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 ((IFluentMap)this).DefaulValue(name, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 /// DbTypeAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 /// <param name="prop"> </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 /// <param name="dbType"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 public MapFieldMap<T,TR> DbType<TR>(Expression<Func<T, TR>> prop, DbType dbType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 ((IFluentMap)this).DbType<TR>(name, dbType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 /// MemberMapperAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 /// <param name="prop"> </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 /// <param name="memberMapperType"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 public MapFieldMap<T,TR> MemberMapper<TR>(Expression<Func<T,TR>> prop, Type memberMapperType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 return this.MemberMapper(prop, null, memberMapperType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 /// MemberMapperAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 /// <param name="prop"> </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 /// <param name="memberType"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 /// <param name="memberMapperType"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 public MapFieldMap<T, TR> MemberMapper<TR>(Expression<Func<T, TR>> prop, Type memberType, Type memberMapperType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 ((IFluentMap)this).MemberMapper<TR>(name, memberType, memberMapperType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 /// NullableAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 /// <param name="isNullable"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 public MapFieldMap<T, TR> Nullable<TR>(Expression<Func<T, TR>> prop, bool isNullable = true)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 ((IFluentMap)this).Nullable(name, isNullable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 /// LazyInstanceAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 /// <param name="isLazy"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 public MapFieldMap<T, TR> LazyInstance<TR>(Expression<Func<T, TR>> prop, bool isLazy = true)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 if (!GetIsVirtual(prop))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 throw new Exception("Property wich uses LazyInstance needs to be virtual!");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 ((IFluentMap)this).LazyInstance(name, isLazy);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 /// NullValueAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 /// <param name="value"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 public MapFieldMap<T, TR> NullValue<TR>(Expression<Func<T, TR>> prop, TR value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 ((IFluentMap)this).NullValue(name, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 /// AssociationAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 /// <typeparam name="TRt"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 /// <typeparam name="TR"> </typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 /// <param name="prop"> </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 /// <param name="canBeNull"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 /// <param name="thisKey"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 /// <param name="thisKeys"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 public MapFieldMap<T, TR>.AssociationMap<TRt> Association<TRt, TR>(Expression<Func<T, TR>> prop, bool canBeNull, Expression<Func<T, TRt>> thisKey, params Expression<Func<T, TRt>>[] thisKeys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 var keys = new List<Expression<Func<T, TRt>>>(thisKeys);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 keys.Insert(0, thisKey);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 return new MapFieldMap<T, TR>.AssociationMap<TRt>(new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop), canBeNull, keys);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 /// AssociationAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 /// <typeparam name="TRt"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 /// <typeparam name="TR"> </typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 /// <param name="prop"> </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 /// <param name="thisKey"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 /// <param name="thisKeys"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 public MapFieldMap<T, TR>.AssociationMap<TRt> Association<TRt, TR>(Expression<Func<T, TR>> prop, Expression<Func<T, TRt>> thisKey, params Expression<Func<T, TRt>>[] thisKeys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 return this.Association(prop, true, thisKey, thisKeys);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 protected MapFieldMap<T, TR> Association<TRt, TR, TRf, TRo>(Expression<Func<T, TR>> prop, bool canBeNull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 , IEnumerable<Expression<Func<T, TRt>>> thisKeys, IEnumerable<Expression<Func<TRf, TRo>>> otherKeys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 ((IFluentMap)this).Association(name, canBeNull, this.KeysToString(thisKeys.ToArray()), this.KeysToString(otherKeys.ToArray()));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 /// Reverse on BLToolkit.Mapping.Association.ParseKeys()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 /// <typeparam name="T1"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 /// <typeparam name="T2"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 /// <param name="keys"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 private string KeysToString<T1, T2>(IEnumerable<Expression<Func<T1, T2>>> keys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 return keys.Select(this.GetExprName).Aggregate((s1, s2) => s1 + ", " + s2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 /// RelationAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 /// <typeparam name="TR"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 /// <param name="slaveIndex"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 /// <param name="masterIndex"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 public MapFieldMap<T, TR> Relation<TR>(Expression<Func<T, TR>> prop, string slaveIndex = null, string masterIndex = null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 return this.Relation(prop, new[] { slaveIndex }, new[] { masterIndex });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 /// RelationAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 /// <typeparam name="TR"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 /// <param name="slaveIndex"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 /// <param name="masterIndex"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 public MapFieldMap<T, TR> Relation<TR>(Expression<Func<T, TR>> prop, string[] slaveIndex, string[] masterIndex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 slaveIndex = (slaveIndex ?? new string[0]).Where(i => !string.IsNullOrEmpty(i)).ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 masterIndex = (masterIndex ?? new string[0]).Where(i => !string.IsNullOrEmpty(i)).ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 Type destinationType = typeof(TR);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 ((IFluentMap)this).Relation(name, destinationType, slaveIndex, masterIndex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 static void FillRelationIndex(string[] index, AttributeExtension attributeExtension, string indexName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 if (index.Any())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 var collection = new AttributeExtensionCollection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 foreach (var s in index)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 var ae = new AttributeExtension();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 ae.Values.Add(TypeExtension.AttrName.Name, s);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 collection.Add(ae);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 attributeExtension.Attributes.Add(indexName, collection);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 /// MapValueAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 /// <typeparam name="TV"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 /// <param name="origValue"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 /// <param name="value"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 /// <param name="values"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 public FluentMap<T> MapValue<TV>(Enum origValue, TV value, params TV[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 ((IFluentMap)this).MapValue(origValue, value, values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 /// MapValueAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 /// <typeparam name="TV"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 /// <param name="origValue"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 /// <param name="value"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 /// <param name="values"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 public FluentMap<T> MapValue<TV>(object origValue, TV value, params TV[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 ((IFluentMap)this).MapValue(origValue, value, values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 /// MapFieldAttribute(isInheritanceDescriminator = true)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 /// <typeparam name="TR"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 /// <param name="prop"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 public FluentMap<T> InheritanceField<TR>(Expression<Func<T, TR>> prop)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 return this.MapField(prop, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 /// InheritanceMappingAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 /// <typeparam name="TC"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 /// <param name="code"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 public FluentMap<T> InheritanceMapping<TC>(object code)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 return this.InheritanceMapping<TC>(code, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 /// InheritanceMappingAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 /// <typeparam name="TC"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 /// <param name="isDefault"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 public FluentMap<T> InheritanceMapping<TC>(bool isDefault)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487 return this.InheritanceMapping<TC>(null, isDefault);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 /// InheritanceMappingAttribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 /// <typeparam name="TC"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494 /// <param name="code"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 /// <param name="isDefault"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 public FluentMap<T> InheritanceMapping<TC>(object code, bool? isDefault)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 ((IFluentMap)this).InheritanceMapping(typeof(TC), code, isDefault);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500 return this;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 protected void FillMapValueExtension<TR, TV>(AttributeNameCollection attributeCollection, TR origValue, TV value, TV[] values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 AttributeExtensionCollection list;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506 if (!attributeCollection.TryGetValue(Attributes.MapValue.Name, out list))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 list = new AttributeExtensionCollection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 attributeCollection.Add(Attributes.MapValue.Name, list);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512 var allValues = new List<TV>(values);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 allValues.Insert(0, value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 var tvFullName = typeof(TV).FullName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 foreach (var val in allValues)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 var attributeExtension = new AttributeExtension();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 attributeExtension.Values.Add(Attributes.MapValue.OrigValue, origValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 attributeExtension.Values.Add(TypeExtension.ValueName.Value, Convert.ToString(val));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 attributeExtension.Values.Add(TypeExtension.ValueName.Value + TypeExtension.ValueName.TypePostfix, tvFullName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 list.Add(attributeExtension);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 protected void FillMemberMapperExtension(AttributeNameCollection attributeCollection, Type memberType, Type memberMapperType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 AttributeExtensionCollection attrs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 if (!attributeCollection.TryGetValue(Attributes.MemberMapper.Name, out attrs))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 attrs = new AttributeExtensionCollection();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 attributeCollection.Add(Attributes.MemberMapper.Name, attrs);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 var attributeExtension = new AttributeExtension();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 attributeExtension.Values.Add(Attributes.MemberMapper.MemberType, memberType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536 attributeExtension.Values.Add(Attributes.MemberMapper.MemberMapperType, memberMapperType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 attrs.Add(attributeExtension);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 /// Fluent settings result
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 public ExtensionList Map()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 var result = new ExtensionList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 this.MapTo(result);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 return result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 /// Apply fluent settings to DbManager
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554 /// <param name="dbManager"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555 public void MapTo(DbManager dbManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 var ms = dbManager.MappingSchema ?? (dbManager.MappingSchema = Mapping.Map.DefaultSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558 this.MapTo(ms);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 /// Apply fluent settings to DataProviderBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 /// <param name="dataProvider"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565 public void MapTo(DataProviderBase dataProvider)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 var ms = dataProvider.MappingSchema ?? (dataProvider.MappingSchema = Mapping.Map.DefaultSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568 this.MapTo(ms);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 /// Apply fluent settings to MappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574 /// <param name="mappingSchema"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 public void MapTo(MappingSchema mappingSchema)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 var extensions = mappingSchema.Extensions ?? (mappingSchema.Extensions = new ExtensionList());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578 this.MapTo(extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 /// Apply fluent settings to ExtensionList
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584 /// <param name="extensions"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585 public void MapTo(ExtensionList extensions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587 var ext = this._typeExtension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588 TypeExtension oldExt;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589 if (extensions.TryGetValue(ext.Name, out oldExt))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 FluentMapHelper.MergeExtensions(ext, ref oldExt);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 extensions.Add(ext);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597 this.EachChilds(m => m.MapTo(extensions));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600 protected MemberExtension GetMemberExtension<TR>(Expression<Func<T, TR>> prop)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602 string name = this.GetExprName(prop);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 return this.GetMemberExtension(name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606 protected MemberExtension GetMemberExtension(string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 MemberExtension member;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609 if (!this._typeExtension.Members.TryGetValue(name, out member))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611 member = new MemberExtension { Name = name };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612 this._typeExtension.Members.Add(member);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 return member;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617 private string GetExprName<TT, TR>(Expression<Func<TT, TR>> prop)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 string result = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620 var memberExpression = prop.Body as MemberExpression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 while (null != memberExpression)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623 result = null == result ? "" : MemberNameSeparator + result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624 result = memberExpression.Member.Name + result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 memberExpression = memberExpression.Expression as MemberExpression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 if (null == result)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629 throw new ArgumentException("Fail member access expression.");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631 return result;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634 static bool GetIsVirtual<TT, TR>(Expression<Func<TT, TR>> prop)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636 var memberExpression = prop.Body as MemberExpression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637 if (memberExpression != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639 var prpInfo = memberExpression.Member as PropertyInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640 if (prpInfo != null && !prpInfo.GetGetMethod().IsVirtual)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650 /// Invert for BLToolkit.Reflection.Extension.TypeExtension.ToBoolean()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652 /// <param name="value"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654 protected string ToString(bool value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
656 return Convert.ToString(value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
657 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
658
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
659 private void EachChilds(Action<IFluentMap> action)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
660 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
661 foreach (var childMap in this.Childs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
662 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
663 action(childMap);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
664 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
665 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
666
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
667 private List<IFluentMap> Childs
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
668 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
669 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
670 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
671 if (null == this._childs)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
672 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
673 this._childs = new List<IFluentMap>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
674 var thisType = typeof(T);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
675 var fmType = typeof(FluentMap<>);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
676 // Find child only first generation ... other generation find recursive
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
677 foreach (var childType in thisType.Assembly.GetTypes().Where(t => t.BaseType == thisType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
678 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
679 this._childs.Add((IFluentMap)Activator.CreateInstance(fmType.MakeGenericType(childType)));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
680 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
681 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
682 return this._childs;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
683 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
684 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
685 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
686 }