Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWebControls / System / Data / WebControls / EntityDataSourceColumn.cs / 1599186 / EntityDataSourceColumn.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.EntityClient; using System.Data.Metadata.Edm; using System.Diagnostics; using System.Globalization; using System.Reflection; using System.ComponentModel; using System.Data.Common; using System.Data.Objects.DataClasses; using System.Data.Objects; using System.Data; using System.Runtime.CompilerServices; namespace System.Web.UI.WebControls { ////// Represents a column in EntityDataSourceView. /// internal abstract class EntityDataSourceColumn { protected EntityDataSourceColumn(string displayName) : this(displayName, (EntityDataSourceColumn)null) { } protected EntityDataSourceColumn(string displayName, EntityDataSourceColumn controllingColumn) { EntityDataSourceUtil.CheckArgumentNull(displayName, "displayName"); this.DisplayName = displayName; this.ControllingColumn = controllingColumn; } ////// Gets the display name for this column. /// internal readonly string DisplayName; ////// Gets the column exposed to the user. For instance, the reference key /// it.Order.OrderID might have a dependent it.OrderID where there is a /// ReferentialConstraint. /// internal readonly EntityDataSourceColumn ControllingColumn; ////// Gets value indicating whether the column should be exposed to the user. /// internal bool IsHidden { get { // Columns with dependents are not shown to the user. They are // merely used to plumb values (e.g. via referential integrity // constraints) return this.ControllingColumn != null; } } ////// Gets the CLR type for the column value. /// internal abstract Type ClrType { get; } ////// Gets a value indicating whether the original value for the column /// needs to be preserved. /// internal abstract bool IsInteresting { get; } ////// Gets a value indicating whether the column can be modified. Can be /// overridden by the collection (which may be readonly). /// internal abstract bool CanWrite { get; } ////// Indicates whether this column can be assigned a value of null. /// internal abstract bool IsNullable { get; } ////// Indicates whether this column represents a primitive type. /// internal abstract bool IsPrimitive { get; } /// Returns an Entity-SQL representation of this column with respect /// to entity parameter 'it'. /// ///Entity-SQL string. internal abstract string GetEntitySqlValue(); internal abstract object GetValue(EntityDataSourceWrapper entity); internal abstract void SetValue(EntityDataSourceWrapper entity, object value); } ////// An EntityDataSourceView column that is an entity type or complex type property. /// internal class EntityDataSourcePropertyColumn : EntityDataSourceColumn { private readonly EntityDataSourceMemberPath memberPath; internal EntityDataSourcePropertyColumn(EntityDataSourceMemberPath memberPath) : base(EntityDataSourceUtil.CheckArgumentNull(memberPath, "memberPath").GetDescription()) { this.memberPath = memberPath; } internal override bool IsInteresting { get { // the member path knows if its interesting... return this.memberPath.IsInteresting; } } internal override bool CanWrite { get { // can always write return true; } } internal override bool IsNullable { get { return memberPath.IsNullable; } } internal override bool IsPrimitive { get { return memberPath.IsPrimitive; } } internal override Type ClrType { get { return this.memberPath.ClrType; } } override internal object GetValue(EntityDataSourceWrapper entity) { return this.memberPath.GetValue(entity); } override internal void SetValue(EntityDataSourceWrapper entity, object value) { this.memberPath.SetValue(entity, value); } internal override string GetEntitySqlValue() { return this.memberPath.GetEntitySqlValue(); } public override string ToString() { return this.memberPath.ToString(); } ////// Indicates whether this column represents a primary key value; /// internal bool IsKey { get { return memberPath.IsKey; } } } ////// An EntityDataSourceView column /// internal class EntityDataSourceReferenceKeyColumn : EntityDataSourceColumn { private readonly EntityDataSourceReferenceGroup group; private readonly EdmProperty keyMember; private readonly Type clrType; private readonly bool isNullable; internal EntityDataSourceReferenceKeyColumn(EntityDataSourceReferenceGroup group, EdmProperty keyMember, EntityDataSourceColumn dependent) : base(CreateDisplayName(group, keyMember), dependent) { EntityDataSourceUtil.CheckArgumentNull(group, "group"); EntityDataSourceUtil.CheckArgumentNull(keyMember, "keyMember"); this.group = group; this.keyMember = keyMember; this.clrType = EntityDataSourceUtil.GetPrimitiveMemberClrType(keyMember); // if the association end is optional (0..1), make sure the CLR type // is also nullable if (this.group.End.CorrespondingAssociationEndMember.RelationshipMultiplicity == RelationshipMultiplicity.ZeroOrOne) { this.clrType = EntityDataSourceUtil.MakeNullable(clrType); this.isNullable = true; } } internal override bool IsInteresting { get { // references are always interesting return true; } } internal override bool CanWrite { get { // references can always be written return true; } } internal override bool IsNullable { get { return this.isNullable; } } internal override bool IsPrimitive { get { return keyMember.TypeUsage.EdmType.BuiltInTypeKind == BuiltInTypeKind.PrimitiveType; } } internal override Type ClrType { get { return this.clrType; } } internal EntityDataSourceReferenceGroup Group { get { return this.group; } } internal EdmMember KeyMember { get { return this.keyMember; } } private static string CreateDisplayName(EntityDataSourceReferenceGroup group, EdmProperty keyMember) { EntityDataSourceUtil.CheckArgumentNull(group, "group"); EntityDataSourceUtil.CheckArgumentNull(keyMember, "keyMember"); NavigationProperty navigationProperty; string result; if (EntityDataSourceUtil.TryGetCorrespondingNavigationProperty(group.End.CorrespondingAssociationEndMember, out navigationProperty)) { result = navigationProperty.Name + "." + keyMember.Name; } else { // if there is no Navigation property, use the TargetTole and KeyMember name // TargetRole.KeyMember result = group.End.Name + "." + keyMember.Name; } return result; } public override string ToString() { return String.Format(CultureInfo.InvariantCulture, "", this.group.End.ParentAssociationSet.Name, this.group.End.Name); } internal override object GetValue(EntityDataSourceWrapper entity) { EntityKey entityKey = this.Group.GetEntityKey(entity); if (null == entityKey) { return null; } else { object value = null; // loop through to find the correct keymember, take compound key into consideration foreach (EntityKeyMember entityKeyValue in entityKey.EntityKeyValues) { if (entityKeyValue.Key == this.KeyMember.Name) { value = entityKeyValue.Value; } } return value; } } internal override void SetValue(EntityDataSourceWrapper entity, object value) { throw new InvalidOperationException(Strings.SetValueNotSupported); } internal override string GetEntitySqlValue() { // syntax: NAVIGATE(it, _association_type_name_, _target_role_name_)._key_member_ StringBuilder builder = new StringBuilder(); builder.Append("NAVIGATE("); builder.Append(EntityDataSourceUtil.EntitySqlElementAlias); builder.Append(", "); builder.Append(EntityDataSourceUtil.CreateEntitySqlTypeIdentifier(this.Group.End.ParentAssociationSet.ElementType)); builder.Append(", "); builder.Append(EntityDataSourceUtil.QuoteEntitySqlIdentifier(this.Group.End.CorrespondingAssociationEndMember.Name)); builder.Append(")."); builder.Append(EntityDataSourceUtil.QuoteEntitySqlIdentifier(this.keyMember.Name)); string result = builder.ToString(); return result; } } internal abstract class EntityDataSourceReferenceValueColumn : EntityDataSourceColumn { private readonly NavigationProperty navigationProperty; protected EntityDataSourceReferenceValueColumn(MetadataWorkspace ocWorkspace, NavigationProperty navigationProperty) : base(EntityDataSourceUtil.CheckArgumentNull(navigationProperty, "navigationProperty").Name) { EntityDataSourceUtil.CheckArgumentNull(ocWorkspace, "ocWorkspace"); this.navigationProperty = navigationProperty; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] internal static EntityDataSourceReferenceValueColumn Create(Type clrToType, MetadataWorkspace ocWorkspace, NavigationProperty navigationProperty) { EntityDataSourceUtil.CheckArgumentNull(clrToType, "clrToType"); Type columnType = typeof(EntityDataSourceReferenceValueColumn<>).MakeGenericType(clrToType); EntityDataSourceReferenceValueColumn result = (EntityDataSourceReferenceValueColumn)Activator.CreateInstance(columnType, ocWorkspace, navigationProperty); return result; } internal override bool CanWrite { get { // can never write to a navigation reference return false; } } internal override bool IsNullable { get { return navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.ZeroOrOne; } } protected NavigationProperty NavigationProperty { get { return this.navigationProperty; } } internal override bool IsPrimitive { get { return false; } } internal override string GetEntitySqlValue() { // it.NavigationPropertyName string result = EntityDataSourceUtil.EntitySqlElementAlias + "." + EntityDataSourceUtil.QuoteEntitySqlIdentifier(this.navigationProperty.Name); return result; } internal override bool IsInteresting { get { // a navigation reference is not written, so its original values aren't interesting return false; } } internal override void SetValue(EntityDataSourceWrapper entity, object value) { throw new InvalidOperationException(Strings.SetValueNotSupported); } } internal class EntityDataSourceReferenceValueColumn : EntityDataSourceReferenceValueColumn where T : class { public EntityDataSourceReferenceValueColumn(MetadataWorkspace ocWorkspace, NavigationProperty navigationProperty) : base(ocWorkspace, navigationProperty) { } internal override object GetValue(EntityDataSourceWrapper entity) { object result; EntityReference reference = GetRelatedReference(entity); if (reference.IsLoaded) { result = reference.Value; } else { result = null; } return result; } internal override Type ClrType { get { return typeof(T); } } private EntityReference GetRelatedReference(EntityDataSourceWrapper entity) { RelationshipManager relationshipManager = entity.RelationshipManager; Debug.Assert(relationshipManager != null, "Coldn't retrieve a RelationshipManager"); EntityReference reference = relationshipManager.GetRelatedReference ( this.NavigationProperty.RelationshipType.FullName, this.NavigationProperty.ToEndMember.Name); return reference; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SafeBitVector32.cs
- EdgeModeValidation.cs
- Stackframe.cs
- Visual.cs
- Types.cs
- ISessionStateStore.cs
- SmiConnection.cs
- DocumentXPathNavigator.cs
- Unit.cs
- SBCSCodePageEncoding.cs
- EditorPart.cs
- TrackingServices.cs
- IDictionary.cs
- WorkflowOperationBehavior.cs
- CodeTypeReference.cs
- HttpModuleActionCollection.cs
- TextBlockAutomationPeer.cs
- TextTreeDeleteContentUndoUnit.cs
- PriorityItem.cs
- InputProcessorProfiles.cs
- IIS7UserPrincipal.cs
- XdrBuilder.cs
- GridViewPageEventArgs.cs
- SystemFonts.cs
- XmlSchemaInclude.cs
- MouseEventArgs.cs
- SystemColors.cs
- WebServiceParameterData.cs
- ImageField.cs
- EventMappingSettings.cs
- WsatConfiguration.cs
- RelativeSource.cs
- AttachedPropertyMethodSelector.cs
- LocalizableResourceBuilder.cs
- CompleteWizardStep.cs
- GroupLabel.cs
- TrackingRecord.cs
- ExtendedPropertiesHandler.cs
- BamlReader.cs
- Peer.cs
- SiteMapPath.cs
- Paragraph.cs
- GestureRecognitionResult.cs
- AppSettingsExpressionBuilder.cs
- TdsValueSetter.cs
- StreamAsIStream.cs
- UnsignedPublishLicense.cs
- DurableTimerExtension.cs
- SqlConnectionStringBuilder.cs
- TypeHelper.cs
- MetadataFile.cs
- OneToOneMappingSerializer.cs
- RightsManagementInformation.cs
- StatusStrip.cs
- UserControlFileEditor.cs
- ComplexTypeEmitter.cs
- IconBitmapDecoder.cs
- NativeMethods.cs
- NamedPipeAppDomainProtocolHandler.cs
- SafeNativeMethodsCLR.cs
- CompensationDesigner.cs
- Propagator.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- PeerNameRecord.cs
- PathNode.cs
- DefaultShape.cs
- Screen.cs
- RoleGroupCollection.cs
- DetailsViewCommandEventArgs.cs
- SmtpNegotiateAuthenticationModule.cs
- ViewgenContext.cs
- TypeElement.cs
- ThreadAttributes.cs
- SmiGettersStream.cs
- DebugInfoGenerator.cs
- DispatcherFrame.cs
- DbModificationCommandTree.cs
- QueuedDeliveryRequirementsMode.cs
- COM2IVsPerPropertyBrowsingHandler.cs
- StylusButton.cs
- ContainerTracking.cs
- BindingOperations.cs
- ContentTextAutomationPeer.cs
- DragDeltaEventArgs.cs
- FontDialog.cs
- WindowsContainer.cs
- TextBounds.cs
- FilteredAttributeCollection.cs
- ImmutableObjectAttribute.cs
- ContractsBCL.cs
- IntSecurity.cs
- ActivityDesignerResources.cs
- AnnotationService.cs
- EventLogEntryCollection.cs
- BitHelper.cs
- ValueUnavailableException.cs
- CriticalHandle.cs
- DependencyPropertyAttribute.cs
- TransformDescriptor.cs
- Parser.cs