假設您有一個純業務層中創建的POCO對象(例如Customer
),然後調用context.Add(customer)
。你已經通過並參考的Customer
對象會被跟蹤嗎?換句話說:你在ObjectStateManager
跟蹤的同一個對象中傳遞的對象,還是不同的對象?實體框架代碼第一個和實體跟蹤
如果它們不是相同的對象,是不是會導致大量的內存消耗,因爲有兩個對象圖始終保持着:一個由您(開發人員)在業務層中,另一個由ObjectStateManager
在DAL中?
假設您有一個純業務層中創建的POCO對象(例如Customer
),然後調用context.Add(customer)
。你已經通過並參考的Customer
對象會被跟蹤嗎?換句話說:你在ObjectStateManager
跟蹤的同一個對象中傳遞的對象,還是不同的對象?實體框架代碼第一個和實體跟蹤
如果它們不是相同的對象,是不是會導致大量的內存消耗,因爲有兩個對象圖始終保持着:一個由您(開發人員)在業務層中,另一個由ObjectStateManager
在DAL中?
上下文的想法是不要讓它變得太大。即使有多個具有不同數據視圖的上下文。甚至可以使用每個工作單元的新環境。 所以是的,它可以變大。關於此主題的一些很好的閱讀 搜索有界上下文和Luw模式。例如來自Julie Lerman。
這裏是由EF管理的反編譯的IEntityWrapper(來自EF5.0/Net 4.0) 在將實體放入ObjectContext時使用了IENtityWrapper。
我讓你決定它是否大。
通過毫米波提到的參考是object Entity { get; } // see below inside wrapper
internal interface IEntityWrapper
{
void EnsureCollectionNotNull(RelatedEnd relatedEnd);
EntityKey GetEntityKeyFromEntity();
void AttachContext(ObjectContext context, EntitySet entitySet, MergeOption mergeOption);
void ResetContext(ObjectContext context, EntitySet entitySet, MergeOption mergeOption);
void DetachContext();
void SetChangeTracker(IEntityChangeTracker changeTracker);
void TakeSnapshot(EntityEntry entry);
void TakeSnapshotOfRelationships(EntityEntry entry);
void CollectionAdd(RelatedEnd relatedEnd, object value);
bool CollectionRemove(RelatedEnd relatedEnd, object value);
object GetNavigationPropertyValue(RelatedEnd relatedEnd);
void SetNavigationPropertyValue(RelatedEnd relatedEnd, object value);
void RemoveNavigationPropertyValue(RelatedEnd relatedEnd, object value);
void SetCurrentValue(EntityEntry entry, StateManagerMemberMetadata member, int ordinal, object target, object value);
void UpdateCurrentValueRecord(object value, EntityEntry entry);
RelationshipManager RelationshipManager { get; }
bool OwnsRelationshipManager { get; }
object Entity { get; }
EntityEntry ObjectStateEntry { get; set; }
EntityKey EntityKey { get; set; }
ObjectContext Context { get; set; }
MergeOption MergeOption { get; }
Type IdentityType { get; }
bool InitializingProxyRelatedEnds { get; set; }
bool RequiresRelationshipChangeTracking { get; }
}
/// <summary>
/// Adds an object to the object context.
/// </summary>
/// <param name="entitySetName">Represents the entity set name, which may optionally be qualified by the entity container name. </param><param name="entity">The <see cref="T:System.Object"/> to add.</param><exception cref="T:System.ArgumentNullException">The <paramref name="entity"/> parameter is null. -or-The <paramref name="entitySetName"/> does not qualify.</exception>
public void AddObject(string entitySetName, object entity)
{
EntityUtil.CheckArgumentNull<object>(entity, "entity");
EntityEntry existingEntry;
IEntityWrapper wrappedEntity = EntityWrapperFactory.WrapEntityUsingContextGettingEntry(entity, this, out existingEntry);
if (existingEntry == null)
this.MetadataWorkspace.ImplicitLoadAssemblyForType(wrappedEntity.IdentityType, (Assembly) null);
EntitySet entitySet;
bool isNoOperation;
this.VerifyRootForAdd(false, entitySetName, wrappedEntity, existingEntry, out entitySet, out isNoOperation);
if (isNoOperation)
return;
System.Data.Objects.Internal.TransactionManager transactionManager = this.ObjectStateManager.TransactionManager;
transactionManager.BeginAddTracking();
try
{
RelationshipManager relationshipManager = wrappedEntity.RelationshipManager;
bool flag = true;
try
{
this.AddSingleObject(entitySet, wrappedEntity, "entity");
flag = false;
}
finally
{
if (flag && wrappedEntity.Context == this)
{
EntityEntry entityEntry = this.ObjectStateManager.FindEntityEntry(wrappedEntity.Entity);
if (entityEntry != null && entityEntry.EntityKey.IsTemporary)
{
relationshipManager.NodeVisited = true;
RelationshipManager.RemoveRelatedEntitiesFromObjectStateManager(wrappedEntity);
RelatedEnd.RemoveEntityFromObjectStateManager(wrappedEntity);
}
}
}
relationshipManager.AddRelatedEntitiesToObjectStateManager(false);
}
finally
{
transactionManager.EndAddTracking();
}
}
這回答了第二部分,但第一部分呢? –
默認情況下,添加已更改。該對象被引用不復制 –
但我試圖比較我插入傳遞的對象和ObjectStateManager中的對象之間的引用,它們不相同。 –
這篇文章解釋了一些有關更改跟蹤與波蘇斯是如何工作的。 http://blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with-poco.aspx –
@ MalcolmO'Hare ,我瀏覽了文章,但我似乎沒有談論這個特殊情況。 –