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
- OdbcConnectionHandle.cs
- RichTextBoxConstants.cs
- RoutedEventValueSerializer.cs
- NativeMethods.cs
- TextRangeSerialization.cs
- ObjectResult.cs
- TextRangeEditLists.cs
- SmtpReplyReaderFactory.cs
- NamespaceMapping.cs
- ProtocolsConfigurationEntry.cs
- XPathParser.cs
- XmlChildNodes.cs
- PageBorderless.cs
- TypeDescriptor.cs
- TextBoxAutomationPeer.cs
- EnterpriseServicesHelper.cs
- ThrowOnMultipleAssignment.cs
- GlyphRunDrawing.cs
- ObjectPropertyMapping.cs
- OleDbFactory.cs
- ServerValidateEventArgs.cs
- _PooledStream.cs
- LoadRetryStrategyFactory.cs
- LessThan.cs
- FormView.cs
- WindowsScrollBarBits.cs
- FlowDecision.cs
- FixedSOMGroup.cs
- LinqExpressionNormalizer.cs
- TextEditorParagraphs.cs
- SrgsGrammarCompiler.cs
- PermissionListSet.cs
- EdmComplexTypeAttribute.cs
- CryptographicAttribute.cs
- COM2ExtendedBrowsingHandler.cs
- TypeSystem.cs
- StringStorage.cs
- SoundPlayer.cs
- WeakHashtable.cs
- Imaging.cs
- TextAutomationPeer.cs
- ColumnTypeConverter.cs
- DataObjectCopyingEventArgs.cs
- PauseStoryboard.cs
- ParameterSubsegment.cs
- elementinformation.cs
- RangeBase.cs
- PropertyValueUIItem.cs
- WebHeaderCollection.cs
- SpanIndex.cs
- InvokeSchedule.cs
- CodeIndexerExpression.cs
- DecimalConverter.cs
- ControlFilterExpression.cs
- CodeTypeReferenceExpression.cs
- DesignerAutoFormatStyle.cs
- X509ChainElement.cs
- DeviceFilterDictionary.cs
- TreeNodeStyleCollectionEditor.cs
- StringToken.cs
- HandleCollector.cs
- shaperfactoryquerycachekey.cs
- EntityDataSourceChangedEventArgs.cs
- DateTimeValueSerializerContext.cs
- GroupItemAutomationPeer.cs
- FSWPathEditor.cs
- ScalarConstant.cs
- DataGridTextBoxColumn.cs
- followingquery.cs
- Button.cs
- _TimerThread.cs
- ProtocolsSection.cs
- PageRequestManager.cs
- DescendentsWalker.cs
- EventHandlersStore.cs
- AttachedPropertyDescriptor.cs
- PeerToPeerException.cs
- RequestQueryProcessor.cs
- ObjectDisposedException.cs
- SafeArchiveContext.cs
- BufferedMessageData.cs
- columnmapfactory.cs
- Metadata.cs
- PrinterSettings.cs
- KnowledgeBase.cs
- XmlEncoding.cs
- ExponentialEase.cs
- oledbmetadatacollectionnames.cs
- VirtualDirectoryMappingCollection.cs
- SelectingProviderEventArgs.cs
- RangeContentEnumerator.cs
- CodeIdentifier.cs
- ManagementExtension.cs
- TextEffectResolver.cs
- ToolStripStatusLabel.cs
- ContractNamespaceAttribute.cs
- ScriptControl.cs
- ListView.cs
- XmlSchemas.cs
- ConversionValidationRule.cs