internal void AssertModificationFunctionMappingInvariants(StorageEntityTypeModificationFunctionMapping modificationFunctionMapping) { Debug.Assert(null != modificationFunctionMapping, "modification function mapping must not be null"); Debug.Assert(modificationFunctionMapping.EntityType.Equals(this.Set.ElementType) || Helper.IsSubtypeOf(modificationFunctionMapping.EntityType, this.Set.ElementType), "attempting to add a modification function mapping with the wrong entity type"); foreach (StorageEntityTypeModificationFunctionMapping existingMapping in m_modificationFunctionMappings) { Debug.Assert(!existingMapping.EntityType.Equals(modificationFunctionMapping.EntityType), "modification function mapping already exists for this type"); } }
/// <summary> /// Requires: /// - Function mapping refers to a sub-type of this entity set's element type /// - Function mappings for types are not redundantly specified /// Adds a new function mapping for this class. /// </summary> /// <param name="modificationFunctionMapping">Function mapping to add. May not be null.</param> internal void AddModificationFunctionMapping(StorageEntityTypeModificationFunctionMapping modificationFunctionMapping) { AssertModificationFunctionMappingInvariants(modificationFunctionMapping); m_modificationFunctionMappings.Add(modificationFunctionMapping); // check if any association sets are indirectly mapped within this function mapping // through association navigation bindings if (null != modificationFunctionMapping.DeleteFunctionMapping) { m_implicitlyMappedAssociationSetEnds.AddRange(modificationFunctionMapping.DeleteFunctionMapping.CollocatedAssociationSetEnds); } if (null != modificationFunctionMapping.InsertFunctionMapping) { m_implicitlyMappedAssociationSetEnds.AddRange(modificationFunctionMapping.InsertFunctionMapping.CollocatedAssociationSetEnds); } if (null != modificationFunctionMapping.UpdateFunctionMapping) { m_implicitlyMappedAssociationSetEnds.AddRange(modificationFunctionMapping.UpdateFunctionMapping.CollocatedAssociationSetEnds); } }
/// <summary> /// Finds interesting members for modification functions mapped to stored procedures and adds them to the <paramref name="interestingMembers"/>. /// </summary> /// <param name="functionMappings">Modification function mapping. Must not be null.</param> /// <param name="interestingMembersKind">Update scenario the members will be used in (in general - partial update vs. full update).</param> /// <param name="interestingMembers"></param> private static void FindInterestingFunctionMappingMembers(StorageEntityTypeModificationFunctionMapping functionMappings, InterestingMembersKind interestingMembersKind, ref List <EdmMember> interestingMembers) { Debug.Assert(functionMappings != null && functionMappings.UpdateFunctionMapping != null, "Expected function mapping fragment with non-null update function mapping"); Debug.Assert(interestingMembers != null, "interestingMembers != null"); // for partial update scenarios (e.g. EntityDataSourceControl) all members are interesting otherwise the data may be corrupt. // See bugs #272992 and #124460 in DevDiv database for more details. For full update scenarios and the obsolete // MetadataWorkspace.GetRequiredOriginalValueMembers() metod we return only members with Version set to "Original". if (interestingMembersKind == InterestingMembersKind.PartialUpdate) { // (5) Members included in Update ModificationFunction interestingMembers.AddRange(functionMappings.UpdateFunctionMapping.ParameterBindings.Select(p => p.MemberPath.Members.Last())); } else { //(4) Members in update ModificationFunction with Version="Original" are "interesting" // This also works when you have complex-types (4.1) Debug.Assert( interestingMembersKind == InterestingMembersKind.FullUpdate || interestingMembersKind == InterestingMembersKind.RequiredOriginalValueMembers, "Unexpected kind of interesting members - if you changed the InterestingMembersKind enum type update this code accordingly"); foreach (var parameterBinding in functionMappings.UpdateFunctionMapping.ParameterBindings.Where(p => !p.IsCurrent)) { //Last is the root element (with respect to the Entity) //For example, Entity1={ // S1, // C1{S2, // C2{ S3, S4 } // }, // S5} // if S4 matches (i.e. C1.C2.S4), then it returns C1 //because internally the list is [S4][C2][C1] interestingMembers.Add(parameterBinding.MemberPath.Members.Last()); } } }
/// <summary> /// Finds interesting members for modification functions mapped to stored procedures and adds them to the <paramref name="interestingMembers"/>. /// </summary> /// <param name="functionMappings">Modification function mapping. Must not be null.</param> /// <param name="interestingMembersKind">Update scenario the members will be used in (in general - partial update vs. full update).</param> /// <param name="interestingMembers"></param> private static void FindInterestingFunctionMappingMembers(StorageEntityTypeModificationFunctionMapping functionMappings, InterestingMembersKind interestingMembersKind, ref List<EdmMember> interestingMembers) { Debug.Assert(functionMappings != null && functionMappings.UpdateFunctionMapping != null, "Expected function mapping fragment with non-null update function mapping"); Debug.Assert(interestingMembers != null, "interestingMembers != null"); // for partial update scenarios (e.g. EntityDataSourceControl) all members are interesting otherwise the data may be corrupt. // See bugs #272992 and #124460 in DevDiv database for more details. For full update scenarios and the obsolete // MetadataWorkspace.GetRequiredOriginalValueMembers() metod we return only members with Version set to "Original". if (interestingMembersKind == InterestingMembersKind.PartialUpdate) { // (5) Members included in Update ModificationFunction interestingMembers.AddRange(functionMappings.UpdateFunctionMapping.ParameterBindings.Select(p => p.MemberPath.Members.Last())); } else { //(4) Members in update ModificationFunction with Version="Original" are "interesting" // This also works when you have complex-types (4.1) Debug.Assert( interestingMembersKind == InterestingMembersKind.FullUpdate || interestingMembersKind == InterestingMembersKind.RequiredOriginalValueMembers, "Unexpected kind of interesting members - if you changed the InterestingMembersKind enum type update this code accordingly"); foreach (var parameterBinding in functionMappings.UpdateFunctionMapping.ParameterBindings.Where(p => !p.IsCurrent)) { //Last is the root element (with respect to the Entity) //For example, Entity1={ // S1, // C1{S2, // C2{ S3, S4 } // }, // S5} // if S4 matches (i.e. C1.C2.S4), then it returns C1 //because internally the list is [S4][C2][C1] interestingMembers.Add(parameterBinding.MemberPath.Members.Last()); } } }