2012-12-17 4 views
0

비즈니스 계층에서 만든 순수 POCO 개체 (예 : Customer)가 있고 context.Add(customer)이라고 가정 해 보겠습니다. Customer 개체가 전달되고 참조가 변경되면 추적이 변경됩니까? 다른 방법으로 말하자면, 동일한 객체에 전달한 객체가 ObjectStateManager에 의해 추적되거나 다른 객체입니까?Entity Framework 코드 첫 번째 및 엔터티 추적

두 개체 그래프가 항상 유지 관리되기 때문에 동일한 개체가 아닌 경우 큰 메모리를 소비하지 않습니다. 하나는 개발자 (비즈니스 계층)이고 다른 하나는 ObjectStateManager DAL에?

+0

이 게시물을 변경 추적 포항 강판 작동 방법에 대한 자세한 내용을 설명합니다. http://blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with-poco.aspx –

+0

@ MalcolmO'Hare , 나는 기사를 통해 탈지 만 나는이 특별한 경우에 대해서 이야기하는 것처럼 보이지 않는다. –

답변

0

컨텍스트의 아이디어는 너무 커지지 않도록하는 것입니다. 서로 다른 데이터보기를 통해 여러 컨텍스트를 보유 할 수도 있습니다. 작업 단위 (Unit of Work) 당 새로운 컨텍스트를 사용하는 경우에도 적용됩니다. 그래, 큰 얻을 수 있습니다. 이 주제에 대한 좋은 읽을 거리 제한된 컨텍스트와 루 패턴을 검색하십시오. 예를 들면 Julie Lerman.

다음은 EF (EF5.0/Net 4.0)가 관리하는 디 컴파일 된 IEntityWrapper입니다. IENtityWrapper는 ObjectContext에 엔터티를 넣을 때 사용됩니다.

큰지를 결정하게합니다. AS 기준 Millimetric 언급
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(); 
    } 
} 
+0

이것은 두 번째 부분에 대한 대답이지만 첫 번째 부분은 무엇입니까? –

+0

추가는 기본적으로 추적되는 변경입니다. 개체가 복사되지 참조 된 –

+0

하지만 삽입을 위해 전달 된 개체와 ObjectStateManager에있는 참조 사이의 비교를 시도하고 그들은 동일하지 않습니다. –

관련 문제