Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Map / Update / Internal / AssociationSetMetadata.cs / 1 / 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 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 "common value" 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 DbQueryCommandTree updateMappingView = (DbQueryCommandTree)workspace.GetCqtView(table); var influencingExtents = EntitySetRetriever.GetEntitySets(updateMappingView.Query); 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 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 "common value" 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 DbQueryCommandTree updateMappingView = (DbQueryCommandTree)workspace.GetCqtView(table); var influencingExtents = EntitySetRetriever.GetEntitySets(updateMappingView.Query); 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
- RefreshPropertiesAttribute.cs
- Vertex.cs
- KeyGestureConverter.cs
- FormViewPagerRow.cs
- ObjectParameterCollection.cs
- RelatedPropertyManager.cs
- ArglessEventHandlerProxy.cs
- DataServiceResponse.cs
- latinshape.cs
- Image.cs
- MsmqHostedTransportConfiguration.cs
- BitmapCodecInfoInternal.cs
- SoapTypeAttribute.cs
- PersonalizablePropertyEntry.cs
- SqlVisitor.cs
- DateTime.cs
- DataGridTableCollection.cs
- DataGridToolTip.cs
- coordinator.cs
- QuarticEase.cs
- TdsValueSetter.cs
- FontSourceCollection.cs
- SqlDataSourceConnectionPanel.cs
- DataTableReaderListener.cs
- EdmToObjectNamespaceMap.cs
- SudsWriter.cs
- Privilege.cs
- WorkflowMarkupSerializationException.cs
- TreeViewImageIndexConverter.cs
- DataBinding.cs
- InterleavedZipPartStream.cs
- Queue.cs
- odbcmetadatafactory.cs
- EnumDataContract.cs
- EntityViewContainer.cs
- EntityCodeGenerator.cs
- SecuritySessionSecurityTokenAuthenticator.cs
- XmlQualifiedName.cs
- SqlParameterizer.cs
- securitycriticaldata.cs
- WindowsListViewItem.cs
- CodeExpressionCollection.cs
- EntityObject.cs
- GeometryGroup.cs
- ImageMetadata.cs
- Vector3DKeyFrameCollection.cs
- CheckBoxField.cs
- NavigateEvent.cs
- DataServiceKeyAttribute.cs
- XmlHierarchicalDataSourceView.cs
- RuntimeResourceSet.cs
- TableRow.cs
- EntryIndex.cs
- KnownTypesProvider.cs
- WmfPlaceableFileHeader.cs
- EntitySetRetriever.cs
- SqlConnectionString.cs
- SingleResultAttribute.cs
- InkCollectionBehavior.cs
- HttpServerVarsCollection.cs
- RandomDelaySendsAsyncResult.cs
- MetafileHeader.cs
- Point4D.cs
- TextParentUndoUnit.cs
- RealizationContext.cs
- CatalogPartChrome.cs
- SimpleType.cs
- TextEffect.cs
- SubMenuStyleCollection.cs
- RepeatButtonAutomationPeer.cs
- RuntimeArgument.cs
- HttpException.cs
- RSAPKCS1SignatureFormatter.cs
- CodeAttributeArgument.cs
- OracleParameter.cs
- SymbolDocumentInfo.cs
- UniqueTransportManagerRegistration.cs
- Debugger.cs
- XhtmlBasicLabelAdapter.cs
- XmlSchemaExporter.cs
- UInt16.cs
- DataGridViewCellStyleBuilderDialog.cs
- BindingMemberInfo.cs
- DSACryptoServiceProvider.cs
- IUnknownConstantAttribute.cs
- BeginEvent.cs
- IDataContractSurrogate.cs
- AttributeEmitter.cs
- hebrewshape.cs
- FixedSOMGroup.cs
- ServiceInfoCollection.cs
- AsyncPostBackTrigger.cs
- XmlNamespaceMapping.cs
- EditableTreeList.cs
- HeaderCollection.cs
- RC2CryptoServiceProvider.cs
- SplitterPanelDesigner.cs
- CqlWriter.cs
- HostedElements.cs
- TimeSpan.cs