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 Set RequiredEnds;
///
/// 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 Set OptionalEnds;
///
/// Gets association ends whose values may influence the association
/// (e.g. where there is a ReferentialIntegrity or "common value" constraint)
///
internal readonly Set IncludedValueEnds;
///
/// 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(Set affectedTables, 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(IEnumerable requiredEnds)
{
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 Set RequiredEnds;
///
/// 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 Set OptionalEnds;
///
/// Gets association ends whose values may influence the association
/// (e.g. where there is a ReferentialIntegrity or "common value" constraint)
///
internal readonly Set IncludedValueEnds;
///
/// 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(Set affectedTables, 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(IEnumerable requiredEnds)
{
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
- figurelengthconverter.cs
- DataGridViewCellValueEventArgs.cs
- EventHandlersStore.cs
- AutoGeneratedFieldProperties.cs
- ApplicationActivator.cs
- RunWorkerCompletedEventArgs.cs
- LongValidatorAttribute.cs
- ContentType.cs
- XmlName.cs
- ColumnMapVisitor.cs
- DecoderNLS.cs
- ConnectionPointCookie.cs
- InputLanguageCollection.cs
- Identity.cs
- PersistencePipeline.cs
- WebPartConnectionsEventArgs.cs
- DbMetaDataFactory.cs
- ServiceProviders.cs
- ReadOnlyHierarchicalDataSource.cs
- KeyValuePairs.cs
- OleDbCommand.cs
- SizeAnimationBase.cs
- HandlerMappingMemo.cs
- DateTimeUtil.cs
- QilSortKey.cs
- DataGridSortCommandEventArgs.cs
- RemotingConfiguration.cs
- Listbox.cs
- HyperLink.cs
- RsaElement.cs
- ApplicationServiceHelper.cs
- ListViewDataItem.cs
- BuildProviderAppliesToAttribute.cs
- StorageAssociationSetMapping.cs
- XmlEnumAttribute.cs
- AssemblyBuilder.cs
- XmlSchemaIdentityConstraint.cs
- BitmapEditor.cs
- _SecureChannel.cs
- PathGeometry.cs
- Parameter.cs
- MergeEnumerator.cs
- WebSysDescriptionAttribute.cs
- CapabilitiesPattern.cs
- ChooseAction.cs
- NumberSubstitution.cs
- AxisAngleRotation3D.cs
- SerializationInfoEnumerator.cs
- XmlNodeChangedEventManager.cs
- DependencyObjectPropertyDescriptor.cs
- RoleService.cs
- LogWriteRestartAreaAsyncResult.cs
- SharedDp.cs
- SortExpressionBuilder.cs
- ManagedIStream.cs
- Point3DAnimation.cs
- CultureSpecificCharacterBufferRange.cs
- HyperlinkAutomationPeer.cs
- Compiler.cs
- GcHandle.cs
- HostedTcpTransportManager.cs
- ColumnMap.cs
- ProfilePropertyMetadata.cs
- OledbConnectionStringbuilder.cs
- DbConnectionInternal.cs
- DataReceivedEventArgs.cs
- TemplateField.cs
- ArrayExtension.cs
- Sql8ConformanceChecker.cs
- EventSinkActivity.cs
- BaseAddressElement.cs
- WebControl.cs
- DefaultMemberAttribute.cs
- RadialGradientBrush.cs
- PropertyGeneratedEventArgs.cs
- HttpHandlersSection.cs
- Html32TextWriter.cs
- WebScriptMetadataMessageEncodingBindingElement.cs
- HitTestResult.cs
- DrawingGroupDrawingContext.cs
- WebPartConnectionsCloseVerb.cs
- EntityDescriptor.cs
- ArrayMergeHelper.cs
- CLSCompliantAttribute.cs
- MetadataCache.cs
- ColumnMapProcessor.cs
- BufferedGraphicsManager.cs
- ToolStripSplitButton.cs
- CompiledRegexRunnerFactory.cs
- ImageField.cs
- FocusManager.cs
- xsdvalidator.cs
- ConstrainedDataObject.cs
- MouseWheelEventArgs.cs
- PropertiesTab.cs
- CircleHotSpot.cs
- ValueConversionAttribute.cs
- SerializationStore.cs
- XmlDomTextWriter.cs
- PlatformCulture.cs