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
- BackgroundWorker.cs
- XMLSchema.cs
- EmbeddedMailObject.cs
- CngProvider.cs
- RuntimeHandles.cs
- SetStoryboardSpeedRatio.cs
- SiteMembershipCondition.cs
- MeasureData.cs
- AttributeCollection.cs
- ConnectionsZone.cs
- CompositeActivityTypeDescriptorProvider.cs
- QilXmlReader.cs
- EditorBrowsableAttribute.cs
- CounterSample.cs
- FusionWrap.cs
- InfoCardBaseException.cs
- XmlReflectionMember.cs
- SqlGatherConsumedAliases.cs
- CodeAssignStatement.cs
- SiteMapPath.cs
- RijndaelManagedTransform.cs
- DbConnectionStringCommon.cs
- ByteConverter.cs
- LookupNode.cs
- TextCollapsingProperties.cs
- OleDbTransaction.cs
- PeerChannelFactory.cs
- DelayedRegex.cs
- StringUtil.cs
- LateBoundBitmapDecoder.cs
- ApplicationActivator.cs
- DataGridViewToolTip.cs
- PackWebRequestFactory.cs
- ToolStripManager.cs
- XmlJsonReader.cs
- XmlExtensionFunction.cs
- LinqDataSourceSelectEventArgs.cs
- SchemaType.cs
- FormViewInsertEventArgs.cs
- COSERVERINFO.cs
- AutoSizeComboBox.cs
- DataControlFieldCollection.cs
- uribuilder.cs
- UdpTransportSettings.cs
- mda.cs
- EntityDataSourceEntitySetNameItem.cs
- Contracts.cs
- BlobPersonalizationState.cs
- TableCellCollection.cs
- ObjectPersistData.cs
- Hash.cs
- XsdBuildProvider.cs
- FileRegion.cs
- SafeRightsManagementSessionHandle.cs
- DataReceivedEventArgs.cs
- ClientScriptManager.cs
- ClientBase.cs
- SizeAnimationBase.cs
- DataGridViewRowsRemovedEventArgs.cs
- PixelFormats.cs
- RoutedEventHandlerInfo.cs
- SqlDependencyUtils.cs
- NamedPipeHostedTransportConfiguration.cs
- UserNamePasswordValidator.cs
- codemethodreferenceexpression.cs
- OutputCacheProfile.cs
- TimeSpanParse.cs
- OutputWindow.cs
- X500Name.cs
- TransactionProtocolConverter.cs
- FontClient.cs
- TextComposition.cs
- Visual3DCollection.cs
- ClientUtils.cs
- storepermissionattribute.cs
- SqlXmlStorage.cs
- EmbeddedObject.cs
- XPathSelfQuery.cs
- InitiatorServiceModelSecurityTokenRequirement.cs
- KeyTime.cs
- RawStylusInputReport.cs
- UnmanagedMarshal.cs
- ProcessModelInfo.cs
- DrawingAttributes.cs
- Quad.cs
- CompilerResults.cs
- HttpListenerContext.cs
- CodePrimitiveExpression.cs
- ValidationError.cs
- ResetableIterator.cs
- X509ChainPolicy.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- EditableRegion.cs
- PageBuildProvider.cs
- Events.cs
- FixedSOMImage.cs
- QilGeneratorEnv.cs
- CommandConverter.cs
- ETagAttribute.cs
- TranslateTransform.cs