Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / DynamicData / DynamicData / ModelProviders / DLinqAssociationProvider.cs / 1305376 / DLinqAssociationProvider.cs
using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data.Linq.Mapping; using System.Linq; using System.Reflection; using System.Diagnostics; using System.Collections.Specialized; using System.Collections; using System.Globalization; namespace System.Web.DynamicData.ModelProviders { internal sealed class DLinqAssociationProvider : AssociationProvider { public DLinqAssociationProvider(DLinqColumnProvider column) { FromColumn = column; MetaAssociation association = column.Member.Association; SetOtherEndOfAssociation(association); SetDirection(association); Debug.Assert(Direction != AssociationDirection.ManyToMany, "Many to Many is not supported by Linq to SQL"); SetAssociationKeyInfo(association); } private void SetAssociationKeyInfo(MetaAssociation association) { DLinqColumnProvider column = (DLinqColumnProvider)FromColumn; ListforeignKeyNames = new List (); int count = column.Member.Association.ThisKey.Count; for (int i = 0; i < count; i++) { MetaDataMember thisKeyMetaDataMember = column.Member.Association.ThisKey[i]; MetaDataMember otherKeyMetaDataMember = column.Member.Association.OtherKey[i]; DLinqColumnProvider thisEntityMemberComponent = FindColumn(column.Table, thisKeyMetaDataMember.Name); if (ShouldRemoveThisAssociation(association)) { column.ShouldRemove = true; return; } foreignKeyNames.Add(thisEntityMemberComponent.Name); if (thisEntityMemberComponent.IsPrimaryKey) { IsPrimaryKeyInThisTable = true; } if (association.IsForeignKey) { thisEntityMemberComponent.IsForeignKeyComponent = true; } } ForeignKeyNames = new ReadOnlyCollection (foreignKeyNames); } private bool ShouldRemoveThisAssociation(MetaAssociation association) { if (Direction == AssociationDirection.ManyToOne && !association.OtherKeyIsPrimaryKey) { return true; } if (Direction == AssociationDirection.OneToMany && !association.ThisKeyIsPrimaryKey) { return true; } if (Direction == AssociationDirection.OneToOne) { if (!association.IsForeignKey && !association.ThisKeyIsPrimaryKey) { return true; } if (association.IsForeignKey && !association.OtherKeyIsPrimaryKey) { return true; } } return false; } private void SetOtherEndOfAssociation(MetaAssociation association) { DLinqTableProvider entityMemberParentEntity = (DLinqTableProvider)FromColumn.Table; DLinqDataModelProvider parentEntityDataContext = (DLinqDataModelProvider)entityMemberParentEntity.DataModel; if (association.OtherMember != null) { ToColumn = parentEntityDataContext.ColumnLookup[(PropertyInfo)association.OtherMember.Member]; } else { ToTable = ((DLinqDataModelProvider)FromColumn.Table.DataModel).DLinqTables.Single(tp => tp.EntityType == association.OtherType.Type); } } private static DLinqColumnProvider FindColumn(TableProvider table, String columnName) { // return (DLinqColumnProvider)table.Columns.First(member => member.Name.Equals(columnName)); } private void SetDirection(MetaAssociation association) { if (association.IsMany) { Direction = AssociationDirection.OneToMany; } else if (association.OtherMember == null || association.OtherMember.Association.IsMany) { // there might not be the other member if this is a one-sided association Direction = AssociationDirection.ManyToOne; } else { Direction = AssociationDirection.OneToOne; } } public override string GetSortExpression(ColumnProvider sortColumn) { return GetSortExpression(sortColumn, "{0}.{1}"); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data.Linq.Mapping; using System.Linq; using System.Reflection; using System.Diagnostics; using System.Collections.Specialized; using System.Collections; using System.Globalization; namespace System.Web.DynamicData.ModelProviders { internal sealed class DLinqAssociationProvider : AssociationProvider { public DLinqAssociationProvider(DLinqColumnProvider column) { FromColumn = column; MetaAssociation association = column.Member.Association; SetOtherEndOfAssociation(association); SetDirection(association); Debug.Assert(Direction != AssociationDirection.ManyToMany, "Many to Many is not supported by Linq to SQL"); SetAssociationKeyInfo(association); } private void SetAssociationKeyInfo(MetaAssociation association) { DLinqColumnProvider column = (DLinqColumnProvider)FromColumn; List foreignKeyNames = new List (); int count = column.Member.Association.ThisKey.Count; for (int i = 0; i < count; i++) { MetaDataMember thisKeyMetaDataMember = column.Member.Association.ThisKey[i]; MetaDataMember otherKeyMetaDataMember = column.Member.Association.OtherKey[i]; DLinqColumnProvider thisEntityMemberComponent = FindColumn(column.Table, thisKeyMetaDataMember.Name); if (ShouldRemoveThisAssociation(association)) { column.ShouldRemove = true; return; } foreignKeyNames.Add(thisEntityMemberComponent.Name); if (thisEntityMemberComponent.IsPrimaryKey) { IsPrimaryKeyInThisTable = true; } if (association.IsForeignKey) { thisEntityMemberComponent.IsForeignKeyComponent = true; } } ForeignKeyNames = new ReadOnlyCollection (foreignKeyNames); } private bool ShouldRemoveThisAssociation(MetaAssociation association) { if (Direction == AssociationDirection.ManyToOne && !association.OtherKeyIsPrimaryKey) { return true; } if (Direction == AssociationDirection.OneToMany && !association.ThisKeyIsPrimaryKey) { return true; } if (Direction == AssociationDirection.OneToOne) { if (!association.IsForeignKey && !association.ThisKeyIsPrimaryKey) { return true; } if (association.IsForeignKey && !association.OtherKeyIsPrimaryKey) { return true; } } return false; } private void SetOtherEndOfAssociation(MetaAssociation association) { DLinqTableProvider entityMemberParentEntity = (DLinqTableProvider)FromColumn.Table; DLinqDataModelProvider parentEntityDataContext = (DLinqDataModelProvider)entityMemberParentEntity.DataModel; if (association.OtherMember != null) { ToColumn = parentEntityDataContext.ColumnLookup[(PropertyInfo)association.OtherMember.Member]; } else { ToTable = ((DLinqDataModelProvider)FromColumn.Table.DataModel).DLinqTables.Single(tp => tp.EntityType == association.OtherType.Type); } } private static DLinqColumnProvider FindColumn(TableProvider table, String columnName) { // return (DLinqColumnProvider)table.Columns.First(member => member.Name.Equals(columnName)); } private void SetDirection(MetaAssociation association) { if (association.IsMany) { Direction = AssociationDirection.OneToMany; } else if (association.OtherMember == null || association.OtherMember.Association.IsMany) { // there might not be the other member if this is a one-sided association Direction = AssociationDirection.ManyToOne; } else { Direction = AssociationDirection.OneToOne; } } public override string GetSortExpression(ColumnProvider sortColumn) { return GetSortExpression(sortColumn, "{0}.{1}"); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlAttributeCollection.cs
- Hashtable.cs
- HttpException.cs
- QualifierSet.cs
- ControlParameter.cs
- CellLabel.cs
- DataGridViewUtilities.cs
- NetworkCredential.cs
- SynchronizationContext.cs
- DSASignatureDeformatter.cs
- TimeSpanStorage.cs
- InternalConfigHost.cs
- SingleObjectCollection.cs
- ServiceDesigner.xaml.cs
- TextParaClient.cs
- WinEventWrap.cs
- FontStyles.cs
- StaticSiteMapProvider.cs
- HttpsHostedTransportConfiguration.cs
- FrameworkElementFactoryMarkupObject.cs
- TextAutomationPeer.cs
- Transform3D.cs
- ClientSponsor.cs
- PageThemeBuildProvider.cs
- TextTreeDeleteContentUndoUnit.cs
- SortedSetDebugView.cs
- UIElement3DAutomationPeer.cs
- SnapLine.cs
- HttpClientCertificate.cs
- Journaling.cs
- WindowsSlider.cs
- RoutedEventHandlerInfo.cs
- controlskin.cs
- Error.cs
- ResourceWriter.cs
- RecordManager.cs
- PrintPreviewDialog.cs
- bindurihelper.cs
- CreateUserWizardStep.cs
- objectquery_tresulttype.cs
- LiteralControl.cs
- InvalidChannelBindingException.cs
- GroupBoxDesigner.cs
- EventArgs.cs
- ContextMenuAutomationPeer.cs
- SqlEnums.cs
- StylusButton.cs
- ExpressionsCollectionConverter.cs
- TCPListener.cs
- XslTransform.cs
- TranslateTransform3D.cs
- ExpressionBindingsDialog.cs
- CompositeActivityValidator.cs
- WebPartHeaderCloseVerb.cs
- DataGridViewRowHeightInfoPushedEventArgs.cs
- StrokeSerializer.cs
- DetailsViewUpdateEventArgs.cs
- LeftCellWrapper.cs
- Assembly.cs
- TextParaClient.cs
- EditorPartCollection.cs
- InputChannelAcceptor.cs
- ToolStripStatusLabel.cs
- TemplatedEditableDesignerRegion.cs
- XmlNamespaceDeclarationsAttribute.cs
- DataGridAutoFormat.cs
- XmlSubtreeReader.cs
- BaseTemplateBuildProvider.cs
- WebPartConnectionsConfigureVerb.cs
- ThreadWorkerController.cs
- ItemMap.cs
- DataKey.cs
- _Connection.cs
- webclient.cs
- AliasGenerator.cs
- DrawingContextWalker.cs
- TextTreeTextBlock.cs
- TreeViewAutomationPeer.cs
- DataControlCommands.cs
- InternalBufferOverflowException.cs
- StylusCollection.cs
- GC.cs
- XamlPointCollectionSerializer.cs
- ToolStripRendererSwitcher.cs
- EditingMode.cs
- OledbConnectionStringbuilder.cs
- FrameworkTextComposition.cs
- ProxyWebPartManager.cs
- ConnectivityStatus.cs
- HtmlImage.cs
- _FixedSizeReader.cs
- DiagnosticTraceRecords.cs
- NotFiniteNumberException.cs
- SpeakProgressEventArgs.cs
- RenderData.cs
- PrimitiveXmlSerializers.cs
- AsyncResult.cs
- UniqueIdentifierService.cs
- DesignerOptionService.cs
- Document.cs