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;
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.
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
- TypeName.cs
- QueryOpeningEnumerator.cs
- HtmlShimManager.cs
- SimpleApplicationHost.cs
- XmlSchemaComplexContentRestriction.cs
- AccessDataSource.cs
- entitydatasourceentitysetnameconverter.cs
- Simplifier.cs
- PasswordTextNavigator.cs
- PkcsMisc.cs
- SafeEventLogReadHandle.cs
- DynamicResourceExtension.cs
- PageAction.cs
- BindingBase.cs
- CompressionTracing.cs
- MembershipValidatePasswordEventArgs.cs
- DropShadowEffect.cs
- DataGridViewRow.cs
- BinaryEditor.cs
- LocationSectionRecord.cs
- Lookup.cs
- InputLangChangeRequestEvent.cs
- HelpEvent.cs
- GeometryModel3D.cs
- ListenerElementsCollection.cs
- EqualityComparer.cs
- Models.cs
- DesignTimeData.cs
- CAGDesigner.cs
- ConnectionsZoneDesigner.cs
- ColorConvertedBitmap.cs
- EmbeddedMailObjectsCollection.cs
- ResourcePool.cs
- DBCommand.cs
- AssociationType.cs
- ConnectionManager.cs
- CommandLibraryHelper.cs
- HostingEnvironment.cs
- SapiRecoInterop.cs
- CodeTypeConstructor.cs
- ObjectParameterCollection.cs
- DataSourceControlBuilder.cs
- ISAPIWorkerRequest.cs
- ExpressionDumper.cs
- DataErrorValidationRule.cs
- ThemeDirectoryCompiler.cs
- FixedTextSelectionProcessor.cs
- UrlAuthorizationModule.cs
- WebUtil.cs
- ProviderSettings.cs
- FixedFlowMap.cs
- FileDetails.cs
- CredentialCache.cs
- infer.cs
- DbConnectionClosed.cs
- DataPager.cs
- DataViewSettingCollection.cs
- TextEditorSpelling.cs
- Condition.cs
- SqlComparer.cs
- AppDomainInfo.cs
- RepeaterItemCollection.cs
- OdbcTransaction.cs
- PositiveTimeSpanValidatorAttribute.cs
- documentation.cs
- CdpEqualityComparer.cs
- sitestring.cs
- Int64.cs
- BaseEntityWrapper.cs
- Translator.cs
- CatalogZoneDesigner.cs
- ConfigurationPropertyCollection.cs
- CurrentChangingEventArgs.cs
- SizeValueSerializer.cs
- AdornerLayer.cs
- unitconverter.cs
- RuntimeArgumentHandle.cs
- XPSSignatureDefinition.cs
- Delegate.cs
- InkCanvasFeedbackAdorner.cs
- AccessibleObject.cs
- OleDbRowUpdatingEvent.cs
- MouseEventArgs.cs
- GroupedContextMenuStrip.cs
- RoleManagerEventArgs.cs
- MembershipValidatePasswordEventArgs.cs
- HttpHandlersInstallComponent.cs
- CursorConverter.cs
- TreeNodeStyle.cs
- SimpleTypeResolver.cs
- ObjectTypeMapping.cs
- XmlUtilWriter.cs
- StickyNote.cs
- FormsAuthenticationCredentials.cs
- ParameterToken.cs
- OdbcError.cs
- StyleCollection.cs
- BitmapPalette.cs
- GradientStop.cs
- TemplatedEditableDesignerRegion.cs