File: System\Data\Objects\Internal\NullEntityWrapper.cs
Project: ndp\fx\src\DataEntity\System.Data.Entity.csproj (System.Data.Entity)
//---------------------------------------------------------------------
// <copyright file="NullEntityWrapper.cs" company="Microsoft">
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//
// @owner       Microsoft
// @backupOwner Microsoft
//---------------------------------------------------------------------
namespace System.Data.Objects.Internal
{
    using System.Data.Metadata.Edm;
    using System.Data.Objects.DataClasses;
    using System.Diagnostics;
 
    /// <summary>
    /// Defines an entity wrapper that wraps an entity with a null value.
    /// This is a singleton class for which the same instance is always returned
    /// any time a wrapper around a null entity is requested.  Objects of this
    /// type are immutable and mutable to allow this behavior to work correctly.
    /// </summary>
    internal class NullEntityWrapper : IEntityWrapper
    {
        private static IEntityWrapper s_nullWrapper = new NullEntityWrapper();
 
        // Private constructor prevents anyone else from creating an instance
        private NullEntityWrapper()
        {
        }
 
        /// <summary>
        /// The single instance of this class.
        /// </summary>
        internal static IEntityWrapper NullWrapper
        {
            get { return s_nullWrapper; }
        }
 
        public RelationshipManager RelationshipManager
        {
            get
            {
                Debug.Fail("Cannot access RelationshipManager from null wrapper.");
                return null;
            }
        }
 
        public bool OwnsRelationshipManager
        {
            get
            {
                Debug.Fail("Cannot access RelationshipManager from null wrapper.");
                return false;
            }
        }
 
        public object Entity
        {
            get { return null; }
        }
 
        public EntityEntry ObjectStateEntry
        {
            get { return null; }
            set { }
        }
 
        public void CollectionAdd(RelatedEnd relatedEnd, object value)
        {
            Debug.Fail("Cannot modify collection from null wrapper.");
        }
 
        public bool CollectionRemove(RelatedEnd relatedEnd, object value)
        {
            Debug.Fail("Cannot modify collection from null wrapper.");
            return false;
        }
 
        public EntityKey EntityKey
        {
            get
            {
                Debug.Fail("Cannot access EntityKey from null wrapper.");
                return null;
            }
            set
            {
                Debug.Fail("Cannot access EntityKey from null wrapper.");
            }
        }
 
        public EntityKey GetEntityKeyFromEntity()
        {
            Debug.Assert(false, "Method on NullEntityWrapper should not be called");
            return null;
        }
 
        public ObjectContext Context
        {
            get
            {
                Debug.Fail("Cannot access Context from null wrapper.");
                return null;
            }
            set
            {
                Debug.Fail("Cannot access Context from null wrapper.");
            }
        }
 
        public MergeOption MergeOption
        {
            get
            {
                Debug.Fail("Cannot access MergeOption from null wrapper.");
                return MergeOption.NoTracking;
            }
        }
 
        public void AttachContext(ObjectContext context, EntitySet entitySet, MergeOption mergeOption)
        {
            Debug.Fail("Cannot access Context from null wrapper.");
        }
 
        public void ResetContext(ObjectContext context, EntitySet entitySet, MergeOption mergeOption)
        {
            Debug.Fail("Cannot access Context from null wrapper.");
        }
 
        public void DetachContext()
        {
            Debug.Fail("Cannot access Context from null wrapper.");
        }
 
        public void SetChangeTracker(IEntityChangeTracker changeTracker)
        {
            Debug.Fail("Cannot access ChangeTracker from null wrapper.");
        }
 
        public void TakeSnapshot(EntityEntry entry)
        {
            Debug.Fail("Cannot take snapshot of using null wrapper.");
        }
 
        public void TakeSnapshotOfRelationships(EntityEntry entry)
        {
            Debug.Fail("Cannot take snapshot using null wrapper.");
        }
 
        public Type IdentityType
        {
            get
            {
                Debug.Fail("Cannot access IdentityType from null wrapper.");
                return null;
            }
        }
 
        public void EnsureCollectionNotNull(RelatedEnd relatedEnd)
        {
            Debug.Fail("Cannot modify collection from null wrapper.");
        }
 
        public object GetNavigationPropertyValue(RelatedEnd relatedEnd)
        {
            Debug.Fail("Cannot access property using null wrapper.");
            return null;
        }
 
        public void SetNavigationPropertyValue(RelatedEnd relatedEnd, object value)
        {
            Debug.Fail("Cannot access property using null wrapper.");
        }
 
        public void RemoveNavigationPropertyValue(RelatedEnd relatedEnd, object value)
        {
            Debug.Fail("Cannot access property using null wrapper.");
        }
 
        public void SetCurrentValue(EntityEntry entry, StateManagerMemberMetadata member, int ordinal, object target, object value)
        {
            Debug.Fail("Cannot set a value onto a null entity.");
        }
 
        public bool InitializingProxyRelatedEnds
        {
            get
            { 
                Debug.Fail("Cannot access flag on null wrapper.");
                return false;
            }
            set
            {
                Debug.Fail("Cannot access flag on null wrapper.");
            }
        }
 
        public void UpdateCurrentValueRecord(object value, EntityEntry entry)
        {
            Debug.Fail("Cannot UpdateCurrentValueRecord on a null entity."); 
        }
 
        public bool RequiresRelationshipChangeTracking
        {
            get { return false; }
        }
    }
}