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
- QilReference.cs
- OdbcHandle.cs
- AsyncOperationManager.cs
- ProfileParameter.cs
- DataGridColumnReorderingEventArgs.cs
- RadioButtonRenderer.cs
- InternalCache.cs
- CodeTypeMember.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- PrintDialog.cs
- WorkflowDesignerMessageFilter.cs
- PieceDirectory.cs
- ColorTransformHelper.cs
- Socket.cs
- Double.cs
- SmtpMail.cs
- SuppressIldasmAttribute.cs
- ErrorItem.cs
- MessageDroppedTraceRecord.cs
- GlyphElement.cs
- BigInt.cs
- Update.cs
- RawTextInputReport.cs
- ReflectionServiceProvider.cs
- StreamUpdate.cs
- ContentIterators.cs
- HostProtectionException.cs
- MetadataItemCollectionFactory.cs
- ArrangedElement.cs
- SQLMoneyStorage.cs
- tabpagecollectioneditor.cs
- HostingPreferredMapPath.cs
- OdbcConnectionPoolProviderInfo.cs
- SplayTreeNode.cs
- TraceData.cs
- ProfileBuildProvider.cs
- ErrorActivity.cs
- ParserStreamGeometryContext.cs
- JavaScriptSerializer.cs
- EdmItemCollection.OcAssemblyCache.cs
- GeneralTransform2DTo3DTo2D.cs
- WebPartsPersonalization.cs
- ConfigurationElementProperty.cs
- PathGradientBrush.cs
- SQLDoubleStorage.cs
- ObjectDataSourceStatusEventArgs.cs
- BypassElementCollection.cs
- TileBrush.cs
- SynthesizerStateChangedEventArgs.cs
- HttpCookie.cs
- ApplicationServiceManager.cs
- ServiceOperationParameter.cs
- shaperfactory.cs
- HuffCodec.cs
- UpdateRecord.cs
- IndexedEnumerable.cs
- WriteableBitmap.cs
- CapacityStreamGeometryContext.cs
- _BasicClient.cs
- DelegateInArgument.cs
- ExtendLockCommand.cs
- OneOf.cs
- Int32RectValueSerializer.cs
- CssTextWriter.cs
- DocumentSchemaValidator.cs
- SecurityDocument.cs
- CustomAttributeBuilder.cs
- DirectoryLocalQuery.cs
- StyleHelper.cs
- ContentIterators.cs
- DbReferenceCollection.cs
- ZipIOLocalFileBlock.cs
- Compress.cs
- basecomparevalidator.cs
- PrivilegeNotHeldException.cs
- sqlmetadatafactory.cs
- C14NUtil.cs
- Emitter.cs
- HostTimeoutsElement.cs
- QueryResults.cs
- GcHandle.cs
- NameValuePermission.cs
- ConstraintManager.cs
- BufferBuilder.cs
- Image.cs
- SchemaComplexType.cs
- RenderData.cs
- FixedSOMPage.cs
- AssemblyAttributesGoHere.cs
- SamlSecurityTokenAuthenticator.cs
- Application.cs
- FileDataSourceCache.cs
- RoutedPropertyChangedEventArgs.cs
- TextCollapsingProperties.cs
- IpcClientManager.cs
- DelimitedListTraceListener.cs
- StylusShape.cs
- DateTimeSerializationSection.cs
- SoapServerProtocol.cs
- XmlDictionaryReaderQuotasElement.cs