protected override void InvokeInternal(CommandProcessorContext cpc) { if (_endProperty == null) { var cmd = new CreateEndPropertyCommand(_associationSetMapping, _associationSetEnd); CommandProcessor.InvokeSingleCommand(cpc, cmd); _endProperty = cmd.EndProperty; } Debug.Assert(_endProperty != null, "_endProperty should not be null"); if (_endProperty == null) { throw new CannotLocateParentItemException(); } var sp = new ScalarProperty(_endProperty, null); sp.Name.SetRefName(_entityProperty); sp.ColumnName.SetRefName(_tableColumn); _endProperty.AddScalarProperty(sp); XmlModelHelper.NormalizeAndResolve(sp); if (_enforceConstraints) { var asm = _endProperty.Parent as AssociationSetMapping; Debug.Assert(asm != null, "_endProperty parent is not an AssociationSetMapping"); EnforceAssociationSetMappingRules.AddRule(cpc, asm); var assoc = asm.TypeName.Target; Debug.Assert(assoc != null, "_endProperty parent has a null Association"); if (assoc != null) { InferReferentialConstraints.AddRule(cpc, assoc); } } _created = sp; }
internal CreateEndScalarPropertyCommand(CreateEndPropertyCommand prereq, Property entityProperty, Property tableColumn) : this(prereq, entityProperty, tableColumn, true) { }
internal CreateEndScalarPropertyCommand( CreateEndPropertyCommand prereq, Property entityProperty, Property tableColumn, bool enforceConstraints) { Initialize(entityProperty, tableColumn, enforceConstraints); AddPreReqCommand(prereq); }
internal CreateEndScalarPropertyCommand(CreateEndPropertyCommand prereq, Property entityProperty, Property tableColumn) : this(prereq, entityProperty, tableColumn, true) { }
internal CreateEndScalarPropertyCommand( CreateEndPropertyCommand prereq, Property entityProperty, Property tableColumn, bool enforceConstraints) { Initialize(entityProperty, tableColumn, enforceConstraints); AddPreReqCommand(prereq); }
protected override void InvokeInternal(CommandProcessorContext cpc) { if (_endProperty == null) { var cmd = new CreateEndPropertyCommand(_associationSetMapping, _associationSetEnd); CommandProcessor.InvokeSingleCommand(cpc, cmd); _endProperty = cmd.EndProperty; } Debug.Assert(_endProperty != null, "_endProperty should not be null"); if (_endProperty == null) { throw new CannotLocateParentItemException(); } var sp = new ScalarProperty(_endProperty, null); sp.Name.SetRefName(_entityProperty); sp.ColumnName.SetRefName(_tableColumn); _endProperty.AddScalarProperty(sp); XmlModelHelper.NormalizeAndResolve(sp); if (_enforceConstraints) { var asm = _endProperty.Parent as AssociationSetMapping; Debug.Assert(asm != null, "_endProperty parent is not an AssociationSetMapping"); EnforceAssociationSetMappingRules.AddRule(cpc, asm); var assoc = asm.TypeName.Target; Debug.Assert(assoc != null, "_endProperty parent has a null Association"); if (assoc != null) { InferReferentialConstraints.AddRule(cpc, assoc); } } _created = sp; }
private EndProperty CloneEndProperty( CommandProcessorContext cpc, EndProperty endToClone, AssociationSetMapping asmInExistingArtifact, AssociationSetEnd aseInExistingArtifact, Dictionary<EntityType, EntityType> tempArtifactCEntityTypeToNewCEntityTypeInExistingArtifact) { var createEnd = new CreateEndPropertyCommand(asmInExistingArtifact, aseInExistingArtifact); CommandProcessor.InvokeSingleCommand(cpc, createEnd); var endInExistingArtifact = createEnd.EndProperty; if (null == endInExistingArtifact) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseCannotCreateAssociationSetMappingEndProperty, aseInExistingArtifact.ToPrettyString())); } var existingArtifact = cpc.Artifact; Debug.Assert(existingArtifact != null, "existingArtifact is null for endToClone " + endToClone.ToPrettyString()); foreach (var sp in endToClone.ScalarProperties()) { if (null == sp.Name.Target) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseScalarPropertyNoNameTarget, sp.ToPrettyString())); } if (null == sp.ColumnName.Target) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseScalarPropertyNoColumnNameTarget, sp.ToPrettyString())); } var spCSideEntityTypeinTempArtifact = sp.Name.Target.EntityType as ConceptualEntityType; if (null == spCSideEntityTypeinTempArtifact) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseAssociationSetMappingCannotFindEntityTypeForProperty, sp.Name.Target.ToPrettyString())); } var spSSideEntityTypeinTempArtifact = sp.ColumnName.Target.EntityType as StorageEntityType; if (null == spSSideEntityTypeinTempArtifact) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseAssociationSetMappingCannotFindEntityTypeForProperty, sp.ColumnName.Target.ToPrettyString())); } var csdlEntityTypeInExistingArtifact = FindMatchingConceptualEntityTypeInExistingArtifact( spCSideEntityTypeinTempArtifact, tempArtifactCEntityTypeToNewCEntityTypeInExistingArtifact); if (null == csdlEntityTypeInExistingArtifact) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseAssociationSetMappingCannotFindMatchingEntityType, sp.ToPrettyString(), spCSideEntityTypeinTempArtifact.ToPrettyString())); } var ssdlEntityTypeInExistingArtifact = FindMatchingStorageEntityTypeInExistingArtifact(spSSideEntityTypeinTempArtifact); if (null == ssdlEntityTypeInExistingArtifact) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseAssociationSetMappingCannotFindMatchingEntityType, sp.ToPrettyString(), spSSideEntityTypeinTempArtifact.ToPrettyString())); } var entityProperty = FindMatchingPropertyInExistingArtifactEntityType(sp.Name.Target, csdlEntityTypeInExistingArtifact); if (null == entityProperty) { // Cannot find matching property - it must have been unmapped. // So try to create a new mapped property to which to attach // this association. // First find S-side Property in temp artifact to which the C-side // Property identified in the AssociationSetMapping is mapped // (Note: cannot use just sp.ColumnName.Target as the S-side Property // used in the AssociationSetMapping can be different from what is used // for the EntitySetMapping in the temp artifact and it is this latter // we need to replicate here). Property sSidePropertyToBeMappedInTempArtifact = null; foreach (var spInTempArtifact in sp.Name.Target.GetAntiDependenciesOfType<ScalarProperty>()) { // Ensure that S-side ScalarProperty is from an EntitySetMapping (and not // an AssociationSetMapping) in the temp artifact. // Can use first one as in temp artifact there is 1:1 mapping. if (null != spInTempArtifact.GetParentOfType(typeof(EntitySetMapping))) { if (null != spInTempArtifact.ColumnName && null != spInTempArtifact.ColumnName.Target) { if (null == sSidePropertyToBeMappedInTempArtifact) { sSidePropertyToBeMappedInTempArtifact = spInTempArtifact.ColumnName.Target; } else { // error in temp artifact - there's more than 1 EntitySetMapping ScalarProperty // mapped to the C-side Property Debug.Fail( "C-side Property " + sp.Name.Target.ToPrettyString() + " has more than 1 ScalarProperty anti-dep with an EntitySetMapping parent. Should be at most 1."); break; } } } } if (null == sSidePropertyToBeMappedInTempArtifact) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseAssociationSetMappingCannotFindSSideForCSideProperty, sp.ToPrettyString(), sp.Name.Target.ToPrettyString())); } // Now find the matching S-side Property in the existing artifact var sSidePropertyToBeMappedInExistingArtifact = FindSSidePropInExistingArtifact(sSidePropertyToBeMappedInTempArtifact); if (null == sSidePropertyToBeMappedInExistingArtifact) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseAssociationSetMappingCannotFindMatchingSSideProperty, sp.ToPrettyString(), sSidePropertyToBeMappedInTempArtifact.ToPrettyString())); } // Now create a new C-side Property in the existing artifact mapped // to the S-side Property we just found entityProperty = CreateNewConceptualPropertyAndMapping( cpc, sp.Name.Target, sSidePropertyToBeMappedInTempArtifact, csdlEntityTypeInExistingArtifact); if (null == entityProperty) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseAssociationSetMappingCannotFindOrCreateMatchingProperty, sp.ToPrettyString(), sp.Name.Target.ToPrettyString(), csdlEntityTypeInExistingArtifact.ToPrettyString())); } } var tableColumn = FindMatchingPropertyInExistingArtifactEntityType(sp.ColumnName.Target, ssdlEntityTypeInExistingArtifact); if (null == tableColumn) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseAssociationSetMappingCannotFindMatchingProperty, sp.ToPrettyString(), sp.ColumnName.Target.ToPrettyString(), ssdlEntityTypeInExistingArtifact.ToPrettyString())); } var createScalar = new CreateEndScalarPropertyCommand(endInExistingArtifact, entityProperty, tableColumn); CommandProcessor.InvokeSingleCommand(cpc, createScalar); var existingScalarProp = createScalar.ScalarProperty; if (null == existingScalarProp) { throw new UpdateModelFromDatabaseException( string.Format( CultureInfo.CurrentCulture, Resources.UpdateFromDatabaseCannotCreateAssociationSetMappingScalarProperty, entityProperty.ToPrettyString(), tableColumn.ToPrettyString())); } } return endInExistingArtifact; }