/// <summary> /// Recurses down the complex property to find whether any of the nseted properties has concurrency mode set to "Fixed" /// </summary> /// <param name="complexMapping">Complex property mapping. Must not be null.</param> /// <returns><c>true</c> if any of the descendant properties has concurrency mode set to "Fixed". Otherwise <c>false</c>.</returns> private static bool HasFixedConcurrencyModeInAnyChildProperty(StorageComplexPropertyMapping complexMapping) { Debug.Assert(complexMapping != null, "complexMapping != null"); foreach (StoragePropertyMapping propertyMapping in complexMapping.TypeMappings.SelectMany(m => m.AllProperties)) { StorageScalarPropertyMapping childScalarPropertyMapping = propertyMapping as StorageScalarPropertyMapping; StorageComplexPropertyMapping childComplexPropertyMapping = propertyMapping as StorageComplexPropertyMapping; Debug.Assert(childScalarPropertyMapping != null || childComplexPropertyMapping != null, "Unimplemented property mapping for complex property"); //scalar property and has Fixed CC mode if (childScalarPropertyMapping != null && MetadataHelper.GetConcurrencyMode(childScalarPropertyMapping.EdmProperty) == ConcurrencyMode.Fixed) { return(true); } // Complex Prop and sub-properties or itself has fixed CC mode else if (childComplexPropertyMapping != null && (MetadataHelper.GetConcurrencyMode(childComplexPropertyMapping.EdmProperty) == ConcurrencyMode.Fixed || HasFixedConcurrencyModeInAnyChildProperty(childComplexPropertyMapping))) { return(true); } } return(false); }
protected virtual void Visit(StorageComplexPropertyMapping storageComplexPropertyMapping) { Visit(storageComplexPropertyMapping.EdmProperty); foreach (var mapping in storageComplexPropertyMapping.TypeMappings) { Visit(mapping); } }
/// <summary> /// Finds interesting entity properties - primary keys (if requested), properties (including complex properties and nested properties) /// with concurrency mode set to fixed and C-Side condition members and adds them to the <paramref name="interestingMembers"/>. /// </summary> /// <param name="entityTypeMapping">Entity type mapping. Must not be null.</param> /// <param name="interestingMembersKind">Scenario the members should be returned for.</param> /// <param name="interestingMembers">The list the interesting members (if any) will be added to. Must not be null.</param> private static void FindInterestingEntityMappingMembers(StorageEntityTypeMapping entityTypeMapping, InterestingMembersKind interestingMembersKind, List <EdmMember> interestingMembers) { Debug.Assert(entityTypeMapping != null, "entityTypeMapping != null"); Debug.Assert(interestingMembers != null, "interestingMembers != null"); foreach (var propertyMapping in entityTypeMapping.MappingFragments.SelectMany(mf => mf.AllProperties)) { StorageScalarPropertyMapping scalarPropMapping = propertyMapping as StorageScalarPropertyMapping; StorageComplexPropertyMapping complexPropMapping = propertyMapping as StorageComplexPropertyMapping; StorageConditionPropertyMapping conditionMapping = propertyMapping as StorageConditionPropertyMapping; Debug.Assert(!(propertyMapping is StorageEndPropertyMapping), "association mapping properties should be handled elsewhere."); Debug.Assert(scalarPropMapping != null || complexPropMapping != null || conditionMapping != null, "Unimplemented property mapping"); //scalar property if (scalarPropMapping != null && scalarPropMapping.EdmProperty != null) { // (0) if a member is part of the key it is interesting if (MetadataHelper.IsPartOfEntityTypeKey(scalarPropMapping.EdmProperty)) { // For backwards compatibility we do return primary keys from the obsolete MetadataWorkspace.GetRequiredOriginalValueMembers() method if (interestingMembersKind == InterestingMembersKind.RequiredOriginalValueMembers) { interestingMembers.Add(scalarPropMapping.EdmProperty); } } //(3) if a scalar property has Fixed concurrency mode then it is "interesting" else if (MetadataHelper.GetConcurrencyMode(scalarPropMapping.EdmProperty) == ConcurrencyMode.Fixed) { interestingMembers.Add(scalarPropMapping.EdmProperty); } } else if (complexPropMapping != null) { // (7) All complex members - partial update scenarios only // (3.1) The complex property or its one of its children has fixed concurrency mode if (interestingMembersKind == InterestingMembersKind.PartialUpdate || MetadataHelper.GetConcurrencyMode(complexPropMapping.EdmProperty) == ConcurrencyMode.Fixed || HasFixedConcurrencyModeInAnyChildProperty(complexPropMapping)) { interestingMembers.Add(complexPropMapping.EdmProperty); } } else if (conditionMapping != null) { //(1) C-Side condition members are 'interesting' if (conditionMapping.EdmProperty != null) { interestingMembers.Add(conditionMapping.EdmProperty); } } } }
protected override void Visit(StorageComplexPropertyMapping storageComplexPropertyMapping) { int index; if (!this.AddObjectToSeenListAndHashBuilder(storageComplexPropertyMapping, out index)) { return; } this.AddObjectStartDumpToHashBuilder(storageComplexPropertyMapping, index); #region Inner data visit base.Visit(storageComplexPropertyMapping); #endregion this.AddObjectEndDumpToHashBuilder(); }
/// <summary> /// Recurses down the complex property to find whether any of the nseted properties has concurrency mode set to "Fixed" /// </summary> /// <param name="complexMapping">Complex property mapping. Must not be null.</param> /// <returns><c>true</c> if any of the descendant properties has concurrency mode set to "Fixed". Otherwise <c>false</c>.</returns> private static bool HasFixedConcurrencyModeInAnyChildProperty(StorageComplexPropertyMapping complexMapping) { Debug.Assert(complexMapping != null, "complexMapping != null"); foreach (StoragePropertyMapping propertyMapping in complexMapping.TypeMappings.SelectMany(m => m.AllProperties)) { StorageScalarPropertyMapping childScalarPropertyMapping = propertyMapping as StorageScalarPropertyMapping; StorageComplexPropertyMapping childComplexPropertyMapping = propertyMapping as StorageComplexPropertyMapping; Debug.Assert(childScalarPropertyMapping != null || childComplexPropertyMapping != null, "Unimplemented property mapping for complex property"); //scalar property and has Fixed CC mode if (childScalarPropertyMapping != null && MetadataHelper.GetConcurrencyMode(childScalarPropertyMapping.EdmProperty) == ConcurrencyMode.Fixed) { return true; } // Complex Prop and sub-properties or itself has fixed CC mode else if (childComplexPropertyMapping != null && (MetadataHelper.GetConcurrencyMode(childComplexPropertyMapping.EdmProperty) == ConcurrencyMode.Fixed || HasFixedConcurrencyModeInAnyChildProperty(childComplexPropertyMapping))) { return true; } } return false; }