Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Map / Update / Internal / AssociationSetMetadata.cs / 1305376 / AssociationSetMetadata.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System.Data.Metadata.Edm; using System.Data.Common.Utils; using System.Data.Common.CommandTrees; using System.Collections.Generic; using System.Linq; namespace System.Data.Mapping.Update.Internal { ////// Encapsulates information about ends of an association set needed to correctly /// interpret updates. /// internal sealed class AssociationSetMetadata { ////// Gets association ends that must be modified if the association /// is changed (e.g. the mapping of the association is conditioned /// on some property of the end) /// internal readonly SetRequiredEnds; /// /// Gets association ends that may be implicitly modified as a result /// of changes to the association (e.g. collocated entity with server /// generated value) /// internal readonly SetOptionalEnds; /// /// Gets association ends whose values may influence the association /// (e.g. where there is a ReferentialIntegrity or "foreign key" constraint) /// internal readonly SetIncludedValueEnds; /// /// true iff. there are interesting ends for this association set. /// internal bool HasEnds { get { return 0 < RequiredEnds.Count || 0 < OptionalEnds.Count || 0 < IncludedValueEnds.Count; } } ////// Initialize Metadata for an AssociationSet /// internal AssociationSetMetadata(SetaffectedTables, AssociationSet associationSet, MetadataWorkspace workspace) { // If there is only 1 table, there can be no ambiguity about the "destination" of a relationship, so such // sets are not typically required. bool isRequired = 1 < affectedTables.Count; // determine the ends of the relationship var ends = associationSet.AssociationSetEnds; // find collocated entities foreach (EntitySet table in affectedTables) { // Find extents influencing the table var influencingExtents = MetadataHelper.GetInfluencingEntitySetsForTable(table, workspace); foreach (EntitySet influencingExtent in influencingExtents) { foreach (var end in ends) { // If the extent is an end of the relationship and we haven't already added it to the // required set... if (end.EntitySet.EdmEquals(influencingExtent)) { if (isRequired) { AddEnd(ref RequiredEnds, end.CorrespondingAssociationEndMember); } else if (null == RequiredEnds || !RequiredEnds.Contains(end.CorrespondingAssociationEndMember)) { AddEnd(ref OptionalEnds, end.CorrespondingAssociationEndMember); } } } } } // fix Required and Optional sets FixSet(ref RequiredEnds); FixSet(ref OptionalEnds); // for associations with referential constraints, the principal end is always interesting // since its key values may take precedence over the key values of the dependent end foreach (ReferentialConstraint constraint in associationSet.ElementType.ReferentialConstraints) { // FromRole is the principal end in the referential constraint AssociationEndMember principalEnd = (AssociationEndMember)constraint.FromRole; if (!RequiredEnds.Contains(principalEnd) && !OptionalEnds.Contains(principalEnd)) { AddEnd(ref IncludedValueEnds, principalEnd); } } FixSet(ref IncludedValueEnds); } /// /// Initialize given required ends. /// internal AssociationSetMetadata(IEnumerablerequiredEnds) { if (requiredEnds.Any()) { RequiredEnds = new Set (requiredEnds); } FixSet(ref RequiredEnds); FixSet(ref OptionalEnds); FixSet(ref IncludedValueEnds); } static private void AddEnd(ref Set set, AssociationEndMember element) { if (null == set) { set = new Set (); } set.Add(element); } static private void FixSet(ref Set set) { if (null == set) { set = Set .Empty; } else { set.MakeReadOnly(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System.Data.Metadata.Edm; using System.Data.Common.Utils; using System.Data.Common.CommandTrees; using System.Collections.Generic; using System.Linq; namespace System.Data.Mapping.Update.Internal { ////// Encapsulates information about ends of an association set needed to correctly /// interpret updates. /// internal sealed class AssociationSetMetadata { ////// Gets association ends that must be modified if the association /// is changed (e.g. the mapping of the association is conditioned /// on some property of the end) /// internal readonly SetRequiredEnds; /// /// Gets association ends that may be implicitly modified as a result /// of changes to the association (e.g. collocated entity with server /// generated value) /// internal readonly SetOptionalEnds; /// /// Gets association ends whose values may influence the association /// (e.g. where there is a ReferentialIntegrity or "foreign key" constraint) /// internal readonly SetIncludedValueEnds; /// /// true iff. there are interesting ends for this association set. /// internal bool HasEnds { get { return 0 < RequiredEnds.Count || 0 < OptionalEnds.Count || 0 < IncludedValueEnds.Count; } } ////// Initialize Metadata for an AssociationSet /// internal AssociationSetMetadata(SetaffectedTables, AssociationSet associationSet, MetadataWorkspace workspace) { // If there is only 1 table, there can be no ambiguity about the "destination" of a relationship, so such // sets are not typically required. bool isRequired = 1 < affectedTables.Count; // determine the ends of the relationship var ends = associationSet.AssociationSetEnds; // find collocated entities foreach (EntitySet table in affectedTables) { // Find extents influencing the table var influencingExtents = MetadataHelper.GetInfluencingEntitySetsForTable(table, workspace); foreach (EntitySet influencingExtent in influencingExtents) { foreach (var end in ends) { // If the extent is an end of the relationship and we haven't already added it to the // required set... if (end.EntitySet.EdmEquals(influencingExtent)) { if (isRequired) { AddEnd(ref RequiredEnds, end.CorrespondingAssociationEndMember); } else if (null == RequiredEnds || !RequiredEnds.Contains(end.CorrespondingAssociationEndMember)) { AddEnd(ref OptionalEnds, end.CorrespondingAssociationEndMember); } } } } } // fix Required and Optional sets FixSet(ref RequiredEnds); FixSet(ref OptionalEnds); // for associations with referential constraints, the principal end is always interesting // since its key values may take precedence over the key values of the dependent end foreach (ReferentialConstraint constraint in associationSet.ElementType.ReferentialConstraints) { // FromRole is the principal end in the referential constraint AssociationEndMember principalEnd = (AssociationEndMember)constraint.FromRole; if (!RequiredEnds.Contains(principalEnd) && !OptionalEnds.Contains(principalEnd)) { AddEnd(ref IncludedValueEnds, principalEnd); } } FixSet(ref IncludedValueEnds); } /// /// Initialize given required ends. /// internal AssociationSetMetadata(IEnumerablerequiredEnds) { if (requiredEnds.Any()) { RequiredEnds = new Set (requiredEnds); } FixSet(ref RequiredEnds); FixSet(ref OptionalEnds); FixSet(ref IncludedValueEnds); } static private void AddEnd(ref Set set, AssociationEndMember element) { if (null == set) { set = new Set (); } set.Add(element); } static private void FixSet(ref Set set) { if (null == set) { set = Set .Empty; } else { set.MakeReadOnly(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- X509CertificateStore.cs
- PathGeometry.cs
- ModuleBuilderData.cs
- CodeTypeOfExpression.cs
- CurrentTimeZone.cs
- SizeChangedEventArgs.cs
- StyleBamlRecordReader.cs
- MemberNameValidator.cs
- CompilerCollection.cs
- ManipulationInertiaStartingEventArgs.cs
- DesignSurfaceManager.cs
- Vector3DConverter.cs
- XsdBuildProvider.cs
- ImageSourceValueSerializer.cs
- DataObjectCopyingEventArgs.cs
- AppDomainAttributes.cs
- TaskFactory.cs
- SqlWriter.cs
- RubberbandSelector.cs
- ScriptRef.cs
- CodeDOMUtility.cs
- TimelineGroup.cs
- GridViewSelectEventArgs.cs
- TextRangeEditTables.cs
- XmlElementAttributes.cs
- AllMembershipCondition.cs
- ControlTemplate.cs
- MouseGestureConverter.cs
- Int32CollectionConverter.cs
- ProfileEventArgs.cs
- WindowsListViewItem.cs
- ProtocolsSection.cs
- WorkflowPageSetupDialog.cs
- XPathMultyIterator.cs
- ToolTipAutomationPeer.cs
- DashStyle.cs
- TextParaLineResult.cs
- IgnoreSectionHandler.cs
- ParentUndoUnit.cs
- Localizer.cs
- AuthenticationModuleElementCollection.cs
- DurationConverter.cs
- SerializerProvider.cs
- AttributeUsageAttribute.cs
- PageRanges.cs
- CodeGenerationManager.cs
- MemoryPressure.cs
- WpfWebRequestHelper.cs
- ObjectHelper.cs
- DbParameterHelper.cs
- XmlLanguage.cs
- PathFigureCollectionValueSerializer.cs
- HeaderLabel.cs
- SyndicationContent.cs
- LayoutTable.cs
- precedingquery.cs
- ZipIOLocalFileHeader.cs
- GCHandleCookieTable.cs
- Crc32.cs
- WebPartEditorApplyVerb.cs
- Pointer.cs
- JapaneseLunisolarCalendar.cs
- DbCommandTree.cs
- graph.cs
- AdornerPresentationContext.cs
- DataKeyCollection.cs
- AddInToken.cs
- CodeGeneratorOptions.cs
- MimeMapping.cs
- GroupQuery.cs
- Assert.cs
- PropertyStore.cs
- RegisteredDisposeScript.cs
- TypedTableGenerator.cs
- OleDbException.cs
- RtfToken.cs
- sqlinternaltransaction.cs
- ColorConvertedBitmapExtension.cs
- SafeRightsManagementHandle.cs
- GridItemPattern.cs
- LogicalExpressionTypeConverter.cs
- SoapHelper.cs
- NextPreviousPagerField.cs
- XpsFontSerializationService.cs
- AssertSection.cs
- StructuredTypeInfo.cs
- InstanceView.cs
- Task.cs
- ClientTargetCollection.cs
- Int32CollectionValueSerializer.cs
- XpsResourceDictionary.cs
- MDIClient.cs
- MDIControlStrip.cs
- IncrementalCompileAnalyzer.cs
- WSFederationHttpBindingElement.cs
- ReferenceCountedObject.cs
- SQLString.cs
- SerializationObjectManager.cs
- ReadOnlyObservableCollection.cs
- NavigationPropertyAccessor.cs