1 //---------------------------------------------------------------------
2 // <copyright file="BaseMetadataMappingVisitor.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
11 using System.Collections.Generic;
14 using System.Data.Metadata.Edm;
15 using System.Data.Common;
16 using System.Data.Common.Utils;
17 using System.Data.Mapping;
18 using System.Diagnostics;
19 using System.Globalization;
21 namespace System.Data.Mapping
23 internal abstract class BaseMetadataMappingVisitor
25 protected BaseMetadataMappingVisitor()
29 protected virtual void Visit(StorageEntityContainerMapping storageEntityContainerMapping)
31 Visit(storageEntityContainerMapping.EdmEntityContainer);
32 Visit(storageEntityContainerMapping.StorageEntityContainer);
33 foreach (var mapping in storageEntityContainerMapping.EntitySetMaps)
39 protected virtual void Visit(EntitySetBase entitySetBase)
41 // this is a switching node, so no object header and footer will be add for this node,
42 // also this Visit won't add the object to the seen list
44 switch (entitySetBase.BuiltInTypeKind)
46 case BuiltInTypeKind.EntitySet:
47 Visit((EntitySet)entitySetBase);
49 case BuiltInTypeKind.AssociationSet:
50 Visit((AssociationSet)entitySetBase);
53 Debug.Fail(string.Format(CultureInfo.InvariantCulture, "Found type '{0}', did we add a new type?", entitySetBase.BuiltInTypeKind));
58 protected virtual void Visit(StorageSetMapping storageSetMapping)
60 foreach (var typeMapping in storageSetMapping.TypeMappings)
64 Visit(storageSetMapping.EntityContainerMapping);
67 protected virtual void Visit(EntityContainer entityContainer)
69 foreach (var set in entityContainer.BaseEntitySets)
75 protected virtual void Visit(EntitySet entitySet)
77 Visit(entitySet.ElementType);
78 Visit(entitySet.EntityContainer);
81 protected virtual void Visit(AssociationSet associationSet)
83 Visit(associationSet.ElementType);
84 Visit(associationSet.EntityContainer);
85 foreach (var end in associationSet.AssociationSetEnds)
90 protected virtual void Visit(EntityType entityType)
92 foreach (var kmember in entityType.KeyMembers)
97 foreach (var member in entityType.GetDeclaredOnlyMembers<EdmMember>())
102 foreach (var nproperty in entityType.NavigationProperties)
107 foreach (var property in entityType.Properties)
113 protected virtual void Visit(AssociationType associationType)
115 foreach (var endMember in associationType.AssociationEndMembers)
119 Visit(associationType.BaseType);
120 foreach (var keyMember in associationType.KeyMembers)
124 foreach (var member in associationType.GetDeclaredOnlyMembers<EdmMember>())
128 foreach (var item in associationType.ReferentialConstraints)
132 foreach (var item in associationType.RelationshipEndMembers)
138 protected virtual void Visit(AssociationSetEnd associationSetEnd)
140 Visit(associationSetEnd.CorrespondingAssociationEndMember);
141 Visit(associationSetEnd.EntitySet);
142 Visit(associationSetEnd.ParentAssociationSet);
144 protected virtual void Visit(EdmProperty edmProperty)
146 Visit(edmProperty.TypeUsage);
148 protected virtual void Visit(NavigationProperty navigationProperty)
150 Visit(navigationProperty.FromEndMember);
151 Visit(navigationProperty.RelationshipType);
152 Visit(navigationProperty.ToEndMember);
153 Visit(navigationProperty.TypeUsage);
156 protected virtual void Visit(EdmMember edmMember)
158 Visit(edmMember.TypeUsage);
160 protected virtual void Visit(AssociationEndMember associationEndMember)
162 Visit(associationEndMember.TypeUsage);
165 protected virtual void Visit(ReferentialConstraint referentialConstraint)
167 foreach (var property in referentialConstraint.FromProperties)
171 Visit(referentialConstraint.FromRole);
173 foreach (var property in referentialConstraint.ToProperties)
177 Visit(referentialConstraint.ToRole);
179 protected virtual void Visit(RelationshipEndMember relationshipEndMember)
181 Visit(relationshipEndMember.TypeUsage);
183 protected virtual void Visit(TypeUsage typeUsage)
185 Visit(typeUsage.EdmType);
186 foreach (var facet in typeUsage.Facets)
191 protected virtual void Visit(RelationshipType relationshipType)
193 // switching node, will not be add to the seen list
194 if (relationshipType == null)
199 #region Inner data visit
200 switch (relationshipType.BuiltInTypeKind)
202 case BuiltInTypeKind.AssociationType:
203 Visit((AssociationType)relationshipType);
206 Debug.Fail(String.Format(CultureInfo.InvariantCulture, "Found type '{0}', did we add a new type?", relationshipType.BuiltInTypeKind));
211 protected virtual void Visit(EdmType edmType)
213 // switching node, will not be add to the seen list
219 #region Inner data visit
220 switch (edmType.BuiltInTypeKind)
222 case BuiltInTypeKind.EntityType:
223 Visit((EntityType)edmType);
225 case BuiltInTypeKind.AssociationType:
226 Visit((AssociationType)edmType);
228 case BuiltInTypeKind.EdmFunction:
229 Visit((EdmFunction)edmType);
231 case BuiltInTypeKind.ComplexType:
232 Visit((ComplexType)edmType);
234 case BuiltInTypeKind.PrimitiveType:
235 Visit((PrimitiveType)edmType);
237 case BuiltInTypeKind.RefType:
238 Visit((RefType)edmType);
240 case BuiltInTypeKind.CollectionType:
241 Visit((CollectionType)edmType);
243 case BuiltInTypeKind.EnumType:
244 Visit((EnumType)edmType);
247 Debug.Fail(String.Format(CultureInfo.InvariantCulture, "Found type '{0}', did we add a new type?", edmType.BuiltInTypeKind));
252 protected virtual void Visit(Facet facet)
254 Visit(facet.FacetType);
256 protected virtual void Visit(EdmFunction edmFunction)
258 Visit(edmFunction.BaseType);
259 foreach (var entitySet in edmFunction.EntitySets)
261 if (entitySet != null)
266 foreach (var functionParameter in edmFunction.Parameters)
268 Visit(functionParameter);
270 foreach (var returnParameter in edmFunction.ReturnParameters)
272 Visit(returnParameter);
275 protected virtual void Visit(PrimitiveType primitiveType)
278 protected virtual void Visit(ComplexType complexType)
280 Visit(complexType.BaseType);
281 foreach (var member in complexType.Members)
285 foreach (var property in complexType.Properties)
290 protected virtual void Visit(RefType refType)
292 Visit(refType.BaseType);
293 Visit(refType.ElementType);
295 protected virtual void Visit(EnumType enumType)
297 foreach (var member in enumType.Members)
302 protected virtual void Visit(EnumMember enumMember)
305 protected virtual void Visit(CollectionType collectionType)
307 Visit(collectionType.BaseType);
308 Visit(collectionType.TypeUsage);
310 protected virtual void Visit(EntityTypeBase entityTypeBase)
313 if (entityTypeBase == null)
317 switch (entityTypeBase.BuiltInTypeKind)
319 case BuiltInTypeKind.AssociationType:
320 Visit((AssociationType)entityTypeBase);
322 case BuiltInTypeKind.EntityType:
323 Visit((EntityType)entityTypeBase);
326 Debug.Fail(String.Format(CultureInfo.InvariantCulture, "Found type '{0}', did we add a new type?", entityTypeBase.BuiltInTypeKind));
330 protected virtual void Visit(FunctionParameter functionParameter)
332 Visit(functionParameter.DeclaringFunction);
333 Visit(functionParameter.TypeUsage);
335 protected virtual void Visit(DbProviderManifest providerManifest)
338 protected virtual void Visit(StorageTypeMapping storageTypeMapping)
340 foreach (var type in storageTypeMapping.IsOfTypes)
345 foreach (var fragment in storageTypeMapping.MappingFragments)
350 Visit(storageTypeMapping.SetMapping);
352 foreach (var type in storageTypeMapping.Types)
357 protected virtual void Visit(StorageMappingFragment storageMappingFragment)
359 foreach (var property in storageMappingFragment.AllProperties)
364 Visit((EntitySetBase)storageMappingFragment.TableSet);
366 protected virtual void Visit(StoragePropertyMapping storagePropertyMapping)
368 // this is a switching node, so no object header and footer will be add for this node,
369 // also this Visit won't add the object to the seen list
371 if (storagePropertyMapping.GetType() == typeof(StorageComplexPropertyMapping))
373 Visit((StorageComplexPropertyMapping)storagePropertyMapping);
375 else if (storagePropertyMapping.GetType() == typeof(StorageConditionPropertyMapping))
377 Visit((StorageConditionPropertyMapping)storagePropertyMapping);
379 else if (storagePropertyMapping.GetType() == typeof(StorageScalarPropertyMapping))
381 Visit((StorageScalarPropertyMapping)storagePropertyMapping);
385 Debug.Fail(String.Format(CultureInfo.InvariantCulture, "Found type '{0}', did we add a new type?", storagePropertyMapping.GetType()));
388 protected virtual void Visit(StorageComplexPropertyMapping storageComplexPropertyMapping)
390 Visit(storageComplexPropertyMapping.EdmProperty);
391 foreach (var mapping in storageComplexPropertyMapping.TypeMappings)
396 protected virtual void Visit(StorageConditionPropertyMapping storageConditionPropertyMapping)
398 Visit(storageConditionPropertyMapping.ColumnProperty);
399 Visit(storageConditionPropertyMapping.EdmProperty);
401 protected virtual void Visit(StorageScalarPropertyMapping storageScalarPropertyMapping)
403 Visit(storageScalarPropertyMapping.ColumnProperty);
404 Visit(storageScalarPropertyMapping.EdmProperty);
407 protected virtual void Visit(StorageComplexTypeMapping storageComplexTypeMapping)
409 foreach (var property in storageComplexTypeMapping.AllProperties)
414 foreach (var type in storageComplexTypeMapping.IsOfTypes)
419 foreach (var type in storageComplexTypeMapping.Types)