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
- IEnumerable.cs
- TextRangeProviderWrapper.cs
- SQLSingleStorage.cs
- OdbcDataAdapter.cs
- MouseCaptureWithinProperty.cs
- AutoGeneratedField.cs
- SocketStream.cs
- ResXResourceReader.cs
- ContextStaticAttribute.cs
- SafeWaitHandle.cs
- PerformanceCounterPermission.cs
- InfoCardRSAPKCS1KeyExchangeDeformatter.cs
- NumericExpr.cs
- PersonalizationStateQuery.cs
- ToolStripScrollButton.cs
- DocumentScope.cs
- DataTrigger.cs
- XmlSchemaChoice.cs
- EventMetadata.cs
- PriorityBinding.cs
- AccessControlList.cs
- FunctionUpdateCommand.cs
- StreamAsIStream.cs
- Stylesheet.cs
- RotateTransform3D.cs
- SelectionItemPattern.cs
- ImageCodecInfo.cs
- WebPartDisplayModeEventArgs.cs
- HandleValueEditor.cs
- HandlerBase.cs
- ToolStripItemTextRenderEventArgs.cs
- CodeGenerator.cs
- QueryCorrelationInitializer.cs
- WindowsHyperlink.cs
- Int16Storage.cs
- SoapTypeAttribute.cs
- CultureMapper.cs
- Aes.cs
- UserNameSecurityTokenAuthenticator.cs
- XmlDictionaryString.cs
- TextEndOfLine.cs
- DataGridSortCommandEventArgs.cs
- ConnectionStringsExpressionBuilder.cs
- SqlUtil.cs
- DataRelationCollection.cs
- GenericTypeParameterBuilder.cs
- ConfigPathUtility.cs
- XmlTypeMapping.cs
- MenuScrollingVisibilityConverter.cs
- XmlCountingReader.cs
- nulltextnavigator.cs
- ProxySimple.cs
- StateWorkerRequest.cs
- PeerNameRecordCollection.cs
- BackgroundFormatInfo.cs
- HttpListenerRequest.cs
- PropertyValueChangedEvent.cs
- EllipticalNodeOperations.cs
- ContextMenuService.cs
- ImportContext.cs
- ProxyHwnd.cs
- XmlUTF8TextWriter.cs
- CriticalHandle.cs
- DataMemberListEditor.cs
- VisualBasicSettings.cs
- ResolveNameEventArgs.cs
- LingerOption.cs
- SetStateEventArgs.cs
- ByteArrayHelperWithString.cs
- SqlLiftWhereClauses.cs
- TrackingRecordPreFilter.cs
- ManagementObject.cs
- ToolStripSettings.cs
- PrintPageEvent.cs
- BindingObserver.cs
- Polyline.cs
- HttpRuntime.cs
- SectionXmlInfo.cs
- PageAsyncTaskManager.cs
- BlurBitmapEffect.cs
- DataGridViewEditingControlShowingEventArgs.cs
- DurableInstanceProvider.cs
- StagingAreaInputItem.cs
- DataGridViewIntLinkedList.cs
- RawStylusInputCustomData.cs
- ConfigXmlCDataSection.cs
- TimeManager.cs
- AsyncPostBackErrorEventArgs.cs
- RtfControlWordInfo.cs
- ValidationPropertyAttribute.cs
- DataServiceQueryException.cs
- PerspectiveCamera.cs
- DataSourceExpressionCollection.cs
- OutputCacheProfileCollection.cs
- RecognizerBase.cs
- QueueProcessor.cs
- EventHandlers.cs
- StylusDevice.cs
- safesecurityhelperavalon.cs
- DoubleLinkList.cs