/// <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); } } } }
private DbExpression GeneratePredicate(StorageConditionPropertyMapping condition, DbExpression row) { Debug.Assert(condition.EdmProperty == null, "C-side conditions are not supported in function mappings."); DbExpression columnRef = GenerateColumnRef(row, condition.ColumnProperty); if (condition.IsNull.HasValue) { return(condition.IsNull.Value ? (DbExpression)columnRef.IsNull() : (DbExpression)columnRef.IsNull().Not()); } else { return(columnRef.Equal(columnRef.ResultType.Constant(condition.Value))); } }
/// <summary> /// Add a condition property mapping as a child of this complex property mapping /// Condition Property Mapping specifies a Condition either on the C side property or S side property. /// </summary> /// <param name="conditionPropertyMap">The Condition Property mapping that needs to be added</param> internal void AddConditionProperty(StorageConditionPropertyMapping conditionPropertyMap, Action <EdmMember> duplicateMemberConditionError) { //Same Member can not have more than one Condition with in the //same Complex Type. EdmProperty conditionMember = (conditionPropertyMap.EdmProperty != null) ? conditionPropertyMap.EdmProperty : conditionPropertyMap.ColumnProperty; Debug.Assert(conditionMember != null); if (!m_conditionProperties.ContainsKey(conditionMember)) { m_conditionProperties.Add(conditionMember, conditionPropertyMap); } else { duplicateMemberConditionError(conditionMember); } }
protected override void Visit(StorageConditionPropertyMapping storageConditionPropertyMapping) { int index; if (!this.AddObjectToSeenListAndHashBuilder(storageConditionPropertyMapping, out index)) { return; } this.AddObjectStartDumpToHashBuilder(storageConditionPropertyMapping, index); #region Inner data visit this.AddObjectContentToHashBuilder(storageConditionPropertyMapping.IsNull); this.AddObjectContentToHashBuilder(storageConditionPropertyMapping.Value); base.Visit(storageConditionPropertyMapping); #endregion this.AddObjectEndDumpToHashBuilder(); }
/// <summary> /// Add a condition property mapping as a child of this complex property mapping /// Condition Property Mapping specifies a Condition either on the C side property or S side property. /// </summary> /// <param name="conditionPropertyMap">The mapping that needs to be added</param> internal void AddConditionProperty( StorageConditionPropertyMapping conditionPropertyMap, Action<EdmMember> duplicateMemberConditionError) { //Same Member can not have more than one Condition with in the //same Mapping Fragment. var conditionMember = (conditionPropertyMap.EdmProperty != null) ? conditionPropertyMap.EdmProperty : conditionPropertyMap.ColumnProperty; Debug.Assert(conditionMember != null); if (!m_conditionProperties.ContainsKey(conditionMember)) { m_conditionProperties.Add(conditionMember, conditionPropertyMap); } else { duplicateMemberConditionError(conditionMember); } }
protected virtual void Visit(StorageConditionPropertyMapping storageConditionPropertyMapping) { Visit(storageConditionPropertyMapping.ColumnProperty); Visit(storageConditionPropertyMapping.EdmProperty); }
private DbExpression GeneratePredicate(StorageConditionPropertyMapping condition, DbExpression row) { Debug.Assert(condition.EdmProperty == null, "C-side conditions are not supported in function mappings."); DbExpression columnRef = GenerateColumnRef(row, condition.ColumnProperty); if (condition.IsNull.HasValue) { return condition.IsNull.Value ? (DbExpression)columnRef.IsNull() : (DbExpression)columnRef.IsNull().Not(); } else { return columnRef.Equal(columnRef.ResultType.Constant(condition.Value)); } }