annotate Source/ServiceModel/DataService.cs @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +0400
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.Services.Providers;
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
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 namespace BLToolkit.ServiceModel
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using Data.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using Data.Sql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 public class DataService<T> : System.Data.Services.DataService<T>, IServiceProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 where T : IDataContext
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 #region Init
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 public DataService()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 if (_defaultMetadata == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 _defaultMetadata = Tuple.Create(default(T), new MetadataInfo(Map.DefaultSchema));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 _metadata = new MetadataProvider(_defaultMetadata.Item2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 _query = new QueryProvider (_defaultMetadata.Item2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 _update = new UpdateProvider (_defaultMetadata.Item2, _metadata, _query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 static Tuple<T,MetadataInfo> _defaultMetadata;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 public DataService(MappingSchema mappingSchema)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 lock (_cache)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 Tuple<T,MetadataInfo> data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 if (!_cache.TryGetValue(mappingSchema, out data))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 data = Tuple.Create(default(T), new MetadataInfo(mappingSchema));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 _metadata = new MetadataProvider(data.Item2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 _query = new QueryProvider (data.Item2);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 _update = new UpdateProvider (data.Item2, _metadata, _query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 readonly static Dictionary<MappingSchema,Tuple<T,MetadataInfo>> _cache =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 new Dictionary<MappingSchema,Tuple<T,MetadataInfo>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 readonly MetadataProvider _metadata;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 readonly QueryProvider _query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 readonly UpdateProvider _update;
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 #region Public Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 public object GetService(Type serviceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 if (serviceType == typeof(IDataServiceMetadataProvider)) return _metadata;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 if (serviceType == typeof(IDataServiceQueryProvider)) return _query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 if (serviceType == typeof(IDataServiceUpdateProvider)) return _update;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 }
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 MetadataInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 class TypeInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 public ResourceType Type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 public SqlTable Table;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 public ObjectMapper Mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 class MetadataInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 public MetadataInfo(MappingSchema mappingSchema)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 _mappingSchema = mappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 LoadMetadata();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 readonly MappingSchema _mappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 readonly public Dictionary<Type,TypeInfo> TypeDic = new Dictionary<Type,TypeInfo>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 readonly public Dictionary<string,ResourceType> Types = new Dictionary<string,ResourceType>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 readonly public Dictionary<string,ResourceSet> Sets = new Dictionary<string,ResourceSet>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 readonly public Dictionary<string,Func<object,IQueryable>> RootGetters = new Dictionary<string,Func<object,IQueryable>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 void LoadMetadata()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 var n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 var list =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 (
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 from p in typeof(T).GetProperties()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 let t = p.PropertyType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 where t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Table<>)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 let tt = t.GetGenericArguments()[0]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 let tbl = new SqlTable(_mappingSchema, tt)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 where tbl.Fields.Values.Any(f => f.IsPrimaryKey)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 let m = _mappingSchema.GetObjectMapper(tt)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 select new
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 p.Name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 ID = n++,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 Type = tt,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 Table = tbl,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 Mapper = m
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 ).ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 var baseTypes = new Dictionary<Type,Type>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 foreach (var item in list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 foreach (var m in item.Mapper.InheritanceMapping)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 if (!baseTypes.ContainsKey(m.Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 baseTypes.Add(m.Type, item.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 list.Sort((x,y) =>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 Type baseType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 if (baseTypes.TryGetValue(x.Type, out baseType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 if (y.Type == baseType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 return 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 if (baseTypes.TryGetValue(y.Type, out baseType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 if (x.Type == baseType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 return -1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 return x.ID - y.ID;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 foreach (var item in list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 Type baseType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 baseTypes.TryGetValue(item.Type, out baseType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 var type = GetTypeInfo(item.Type, baseType, item.Table, item.Mapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 var set = new ResourceSet(item.Name, type.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 set.SetReadOnly();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 Sets.Add(set.Name, set);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 foreach (var item in list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 foreach (var m in item.Mapper.InheritanceMapping)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 if (!TypeDic.ContainsKey(m.Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 GetTypeInfo(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 m.Type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 item.Type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 new SqlTable(_mappingSchema, item.Type),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 _mappingSchema.GetObjectMapper(item.Type));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 TypeInfo GetTypeInfo(Type type, Type baseType, SqlTable table, ObjectMapper mapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 TypeInfo typeInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 if (!TypeDic.TryGetValue(type, out typeInfo))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 var baseInfo = baseType != null ? TypeDic[baseType] : null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 typeInfo = new TypeInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 Type = new ResourceType(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 ResourceTypeKind.EntityType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 baseInfo != null ? baseInfo.Type : null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 type.Namespace,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 type.Name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 type.IsAbstract),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 Table = table,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 Mapper = mapper,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 foreach (var field in table.Fields.Values)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 if (baseType != null && baseInfo.Table.Fields.ContainsKey(field.Name))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 var kind = ResourcePropertyKind.Primitive;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 var ptype = ResourceType.GetPrimitiveResourceType(field.SystemType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 if (baseType == null && field.IsPrimaryKey)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 kind |= ResourcePropertyKind.Key;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 var p = new ResourceProperty(field.Name, kind, ptype);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 typeInfo.Type.AddProperty(p);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 typeInfo.Type.SetReadOnly();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 Types. Add(typeInfo.Type.FullName, typeInfo.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 TypeDic.Add(type, typeInfo);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 return typeInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 public object CreateInstance(Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 return TypeDic[type].Mapper.CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 #region MetadataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 class MetadataProvider : IDataServiceMetadataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 public MetadataProvider(MetadataInfo data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 _data = data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 readonly MetadataInfo _data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 public bool TryResolveResourceSet(string name, out ResourceSet resourceSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 return _data.Sets.TryGetValue(name, out resourceSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 public ResourceAssociationSet GetResourceAssociationSet(ResourceSet resourceSet, ResourceType resourceType, ResourceProperty resourceProperty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 public bool TryResolveResourceType(string name, out ResourceType resourceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 return _data.Types.TryGetValue(name, out resourceType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 public IEnumerable<ResourceType> GetDerivedTypes(ResourceType resourceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 return _data.TypeDic[resourceType.InstanceType].Mapper.InheritanceMapping.Select(m => _data.TypeDic[m.Type].Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 public bool HasDerivedTypes(ResourceType resourceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 return _data.TypeDic[resourceType.InstanceType].Mapper.InheritanceMapping.Count > 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 public bool TryResolveServiceOperation(string name, out ServiceOperation serviceOperation)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 serviceOperation = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 public string ContainerNamespace { get { return typeof(T).Namespace; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 public string ContainerName { get { return typeof(T).Name; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 public IEnumerable<ResourceSet> ResourceSets { get { return _data.Sets.Values; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 public IEnumerable<ResourceType> Types { get { return _data.Types.Values; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 public IEnumerable<ServiceOperation> ServiceOperations { get { yield break; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 #region QueryProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 class QueryProvider : IDataServiceQueryProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 public QueryProvider(MetadataInfo data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 _data = data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 readonly MetadataInfo _data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 public IQueryable GetQueryRootForResourceSet(ResourceSet resourceSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 Func<object,IQueryable> func;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 lock (_data.RootGetters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 if (!_data.RootGetters.TryGetValue(resourceSet.Name, out func))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 var p = Expression.Parameter(typeof(object), "p");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 var l = Expression.Lambda<Func<object,IQueryable>>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 Expression.PropertyOrField(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 Expression.Convert(p, typeof(T)),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 resourceSet.Name),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 p);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 func = l.Compile();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 _data.RootGetters.Add(resourceSet.Name, func);
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 return func(CurrentDataSource);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 public ResourceType GetResourceType(object target)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 return _data.TypeDic[target.GetType()].Type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 public object GetPropertyValue(object target, ResourceProperty resourceProperty)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 public object GetOpenPropertyValue(object target, string propertyName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 public IEnumerable<KeyValuePair<string,object>> GetOpenPropertyValues(object target)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 public object InvokeServiceOperation(ServiceOperation serviceOperation, object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 public object CurrentDataSource { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 public bool IsNullPropagationRequired { get { return true; } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 #region UpdateProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 abstract class ResourceAction
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 public object Resource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 public class Create : ResourceAction {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 public class Delete : ResourceAction {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 public class Reset : ResourceAction {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 public class Update : ResourceAction
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 public string Property;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 public object Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 class UpdateProvider : IDataServiceUpdateProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 #region Init
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 public UpdateProvider(MetadataInfo data, MetadataProvider metadata, QueryProvider query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 _data = data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 _metadata = metadata;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 _query = query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 readonly MetadataInfo _data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 readonly MetadataProvider _metadata;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 readonly QueryProvider _query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 readonly List<ResourceAction> _actions = new List<ResourceAction>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 #region IDataServiceUpdateProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 public void SetConcurrencyValues(object resourceCookie, bool? checkForEquality, IEnumerable<KeyValuePair<string,object>> concurrencyValues)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 public void AddReferenceToCollection(object targetResource, string propertyName, object resourceToBeAdded)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 public void ClearChanges()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 _actions.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 public object CreateResource(string containerName, string fullTypeName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 ResourceType type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 if (_metadata.TryResolveResourceType(fullTypeName, out type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 var resource = _data.CreateInstance(type.InstanceType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 _actions.Add(new ResourceAction.Create { Resource = resource });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 return resource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 throw new Exception(string.Format("Type '{0}' not found", fullTypeName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 public void DeleteResource(object targetResource)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 _actions.Add(new ResourceAction.Delete { Resource = targetResource });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 public object GetResource(IQueryable query, string fullTypeName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 object resource = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 foreach (var item in query)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 if (resource != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 throw new LinqException("Resource not uniquely identified");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 resource = item;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 return resource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 public object GetValue(object targetResource, string propertyName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 var m = _data.TypeDic[targetResource.GetType()].Mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 return m[propertyName, true].GetValue(targetResource);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 public void RemoveReferenceFromCollection(object targetResource, string propertyName, object resourceToBeRemoved)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 public object ResetResource(object resource)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 _actions.Add(new ResourceAction.Reset { Resource = resource });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 return resource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 public object ResolveResource(object resource)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 return resource;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 public void SaveChanges()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 public void SetReference(object targetResource, string propertyName, object propertyValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 public void SetValue(object targetResource, string propertyName, object propertyValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 var m = _data.TypeDic[targetResource.GetType()].Mapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 m[propertyName, true].SetValue(targetResource, propertyValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 _actions.Add(new ResourceAction.Update { Resource = targetResource, Property = propertyName, Value = propertyValue });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 }