Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Objects / Internal / BaseEntityWrapper.cs / 1305376 / BaseEntityWrapper.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System.Collections; using System.Data.Objects.DataClasses; using System.Diagnostics; using System.Reflection; using System.Data.Metadata.Edm; namespace System.Data.Objects.Internal { ////// Base class containing common code for different implementations of the IEntityWrapper /// interface. Generally speaking, operations involving the ObjectContext, RelationshipManager /// and raw Entity are handled through this class. /// ///The type of entity wrapped internal abstract class BaseEntityWrapper: IEntityWrapper { // This enum allows boolean flags to be added to the wrapper without introducing a new field // for each one. This helps keep the wrapper memory footprint small, which is important // in some high-performance NoTracking cases. [Flags] private enum WrapperFlags { None = 0, NoTracking = 1, InitializingRelatedEnds = 2, } private readonly RelationshipManager _relationshipManager; private Type _identityType; private WrapperFlags _flags; /// /// Constructs a wrapper for the given entity and its associated RelationshipManager. /// /// The entity to be wrapped /// the RelationshipManager associated with this entity protected BaseEntityWrapper(TEntity entity, RelationshipManager relationshipManager) { Debug.Assert(!(entity is IEntityWrapper), "Object is an IEntityWrapper instance instead of the raw entity."); Debug.Assert(entity != null, "Factory should ensure wrapped entity here is never null."); if (relationshipManager == null) { throw EntityUtil.UnexpectedNullRelationshipManager(); } _relationshipManager = relationshipManager; } ////// Constructs a wrapper as part of the materialization process. This constructor is only used /// during materialization where it is known that the entity being wrapped is newly constructed. /// This means that some checks are not performed that might be needed when thw wrapper is /// created at other times, and information such as the identity type is passed in because /// it is readily available in the materializer. /// /// The entity to wrap /// The RelationshipManager associated with this entity /// The entity set, or null if none is known /// The context to which the entity should be attached /// NoTracking for non-tracked entities, AppendOnly otherwise /// The type of the entity ignoring any possible proxy type protected BaseEntityWrapper(TEntity entity, RelationshipManager relationshipManager, EntitySet entitySet, ObjectContext context, MergeOption mergeOption, Type identityType) { Debug.Assert(!(entity is IEntityWrapper), "Object is an IEntityWrapper instance instead of the raw entity."); Debug.Assert(entity != null, "Factory should ensure wrapped entity here is never null."); if (relationshipManager == null) { throw EntityUtil.UnexpectedNullRelationshipManager(); } _identityType = identityType; _relationshipManager = relationshipManager; RelationshipManager.SetWrappedOwner(this, entity); if (entitySet != null) { Context = context; MergeOption = mergeOption; RelationshipManager.AttachContextToRelatedEnds(context, entitySet, mergeOption); } } // See IEntityWrapper documentation public RelationshipManager RelationshipManager { get { return _relationshipManager; } } // See IEntityWrapper documentation public ObjectContext Context { get; set; } // See IEntityWrapper documentation public MergeOption MergeOption { get { return (_flags & WrapperFlags.NoTracking) != 0 ? MergeOption.NoTracking : MergeOption.AppendOnly; } private set { Debug.Assert(value == MergeOption.AppendOnly || value == MergeOption.NoTracking, "Merge option must be one of NoTracking or AppendOnly."); if (value == MergeOption.NoTracking) { _flags |= WrapperFlags.NoTracking; } else { _flags &= ~WrapperFlags.NoTracking; } } } // See IEntityWrapper documentation public bool InitializingProxyRelatedEnds { get { return (_flags & WrapperFlags.InitializingRelatedEnds) != 0; } set { if (value) { _flags |= WrapperFlags.InitializingRelatedEnds; } else { _flags &= ~WrapperFlags.InitializingRelatedEnds; } } } // See IEntityWrapper documentation public void AttachContext(ObjectContext context, EntitySet entitySet, MergeOption mergeOption) { Debug.Assert(null != context, "context"); Context = context; MergeOption = mergeOption; if (entitySet != null) { RelationshipManager.AttachContextToRelatedEnds(context, entitySet, mergeOption); } } // See IEntityWrapper documentation public void ResetContext(ObjectContext context, EntitySet entitySet, MergeOption mergeOption) { Debug.Assert(null != entitySet, "entitySet should not be null"); Debug.Assert(null != context, "context"); Debug.Assert(MergeOption.NoTracking == mergeOption || MergeOption.AppendOnly == mergeOption, "mergeOption"); if (!object.ReferenceEquals(Context, context)) { Context = context; MergeOption = mergeOption; RelationshipManager.ResetContextOnRelatedEnds(context, entitySet, mergeOption); } } // See IEntityWrapper documentation public void DetachContext() { if (Context != null && Context.ObjectStateManager.TransactionManager.IsAttachTracking && Context.ObjectStateManager.TransactionManager.OriginalMergeOption == MergeOption.NoTracking) { // If AttachTo() failed while attaching graph retrieved with NoTracking option, // we don't want to clear the Context property of the wrapped entity MergeOption = MergeOption.NoTracking; } else { Context = null; } RelationshipManager.DetachContextFromRelatedEnds(); } // See IEntityWrapper documentation public EntityEntry ObjectStateEntry { get; set; } // See IEntityWrapper documentation public Type IdentityType { get { if (_identityType == null) { _identityType = EntityUtil.GetEntityIdentityType(typeof(TEntity)); } return _identityType; } } // All these methods defined by IEntityWrapper public abstract void EnsureCollectionNotNull(RelatedEnd relatedEnd); public abstract EntityKey EntityKey { get; set; } public abstract bool OwnsRelationshipManager { get; } public abstract EntityKey GetEntityKeyFromEntity(); public abstract void SetChangeTracker(IEntityChangeTracker changeTracker); public abstract void TakeSnapshot(EntityEntry entry); public abstract void TakeSnapshotOfRelationships(EntityEntry entry); public abstract object GetNavigationPropertyValue(RelatedEnd relatedEnd); public abstract void SetNavigationPropertyValue(RelatedEnd relatedEnd, object value); public abstract void RemoveNavigationPropertyValue(RelatedEnd relatedEnd, object value); public abstract void CollectionAdd(RelatedEnd relatedEnd, object value); public abstract bool CollectionRemove(RelatedEnd relatedEnd, object value); public abstract object Entity { get; } public abstract TEntity TypedEntity { get; } public abstract void SetCurrentValue(EntityEntry entry, StateManagerMemberMetadata member, int ordinal, object target, object value); public abstract void UpdateCurrentValueRecord(object value, EntityEntry entry); public abstract bool RequiresRelationshipChangeTracking { get; } public abstract bool RequiresScalarChangeTracking { get; } public abstract bool RequiresComplexChangeTracking { get; } public abstract bool RequiresAnyChangeTracking { get; } } } // 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
- X509CertificateCollection.cs
- TreeNodeConverter.cs
- AutomationIdentifier.cs
- BaseCodePageEncoding.cs
- GB18030Encoding.cs
- StorageBasedPackageProperties.cs
- SafeLocalMemHandle.cs
- DBNull.cs
- SortKey.cs
- AssociatedControlConverter.cs
- ToolStripItemTextRenderEventArgs.cs
- DataGridCell.cs
- SmiEventStream.cs
- KeyboardNavigation.cs
- SecurityState.cs
- LabelEditEvent.cs
- SqlDataSourceView.cs
- FixedSOMPageElement.cs
- Configuration.cs
- QilReference.cs
- PostBackTrigger.cs
- RectValueSerializer.cs
- NamespaceDecl.cs
- QueryStringParameter.cs
- AnnouncementClient.cs
- LineServices.cs
- ForEachAction.cs
- SequentialWorkflowHeaderFooter.cs
- ExtensionSurface.cs
- GridViewCancelEditEventArgs.cs
- HitTestWithGeometryDrawingContextWalker.cs
- StylusTouchDevice.cs
- PagePropertiesChangingEventArgs.cs
- XmlSerializerFactory.cs
- TypeNameHelper.cs
- ModelPerspective.cs
- ProcessHostFactoryHelper.cs
- HtmlFormWrapper.cs
- XmlElement.cs
- ErrorLog.cs
- SoapEnumAttribute.cs
- TextTreeTextNode.cs
- StrokeNodeData.cs
- DynamicMethod.cs
- TrackingRecord.cs
- EmissiveMaterial.cs
- EtwTrackingParticipant.cs
- FixedHyperLink.cs
- NotifyIcon.cs
- FloaterParagraph.cs
- DocumentPageHost.cs
- MappedMetaModel.cs
- ListDictionary.cs
- BoundPropertyEntry.cs
- RootBrowserWindowProxy.cs
- EventTrigger.cs
- CodeDelegateCreateExpression.cs
- DataBindingList.cs
- ParentUndoUnit.cs
- HandlerBase.cs
- NamedObjectList.cs
- StandardBindingElement.cs
- EndpointBehaviorElementCollection.cs
- DrawingContext.cs
- PersistenceTypeAttribute.cs
- RowUpdatingEventArgs.cs
- WebControlsSection.cs
- HttpApplication.cs
- Types.cs
- CodeTypeMemberCollection.cs
- HitTestDrawingContextWalker.cs
- TabControl.cs
- SerializationInfoEnumerator.cs
- RemoteWebConfigurationHostServer.cs
- TreeNodeBinding.cs
- Int32Storage.cs
- WebPartDeleteVerb.cs
- NGCPageContentSerializerAsync.cs
- InstanceView.cs
- ReferenceCountedObject.cs
- ProfileBuildProvider.cs
- AttachedPropertyBrowsableForTypeAttribute.cs
- TextElementCollection.cs
- DecoderNLS.cs
- GroupStyle.cs
- mediapermission.cs
- ExtendedPropertyDescriptor.cs
- BrowserDefinition.cs
- SettingsAttributeDictionary.cs
- Transactions.cs
- ExpandableObjectConverter.cs
- Vars.cs
- TransformerTypeCollection.cs
- Camera.cs
- OleTxTransaction.cs
- UniqueConstraint.cs
- FontFamily.cs
- CorePropertiesFilter.cs
- FormViewDeletedEventArgs.cs
- ADMembershipProvider.cs