2011-04-18 6 views
5

How to: Customize Generated Data Objects에 설명 된대로 EntityFramework 객체의 확장을 만들지 만 일부 확장에서는 인스턴스의 ObjectContext를 가져 와서 모델의 다른 값을 조회해야합니다. 나는 Tip 24 – How to get the ObjectContext from an Entity을 찾았지만 몇 년 전에 작성된이 similar SO question에서 언급되었지만 지금은 더 나은 대답이 있기를 바라고 있습니다.엔티티 개체에서 ObjectContext 참조를 가져 오는 가장 빠른 방법은 무엇입니까?

분명히 이것은 엔터티의 개체 컨텍스트를 엔터티 자체에서 검색하는 것이 공식적인 방법으로 지원되어야 할 정도로 자주 필요한 항목이어야합니다.

이 구현에 대한 최신 정보를 미리 감사드립니다.

답변

0

아니요 이러한 방법이 없습니다. 내가 아는 한

[Serializable, DataContract(IsReference=true)] 
public abstract class EntityObject : StructuralObject, IEntityWithKey, 
    IEntityWithChangeTracker, IEntityWithRelationships 
{ 
    ... 
} 

IEntityWithRelationships.RelationshipManagerObjectContext 리드 : 기술 된 해결 방법으로 정의 된 엔티티가 EntityObject에서 파생되기 때문에 유일한 방법처럼 보인다. 이것은 EF 4에서는 변경되지 않았습니다.

또한 엔티티에서 컨텍스트에 액세스하는 것이 일반적이지 않습니다. 이것이 액티브 레코드 패턴을 EF 위에 구현하는 경우에 도움이 될 수 있지만이 경우에는 엔티티의 정적 메서드 내에서 컨텍스트를 만드는 것을 제어 할 수 있으므로 엔티티의 정적 메서드로 설정할 수 있어야합니다. 실재. 다른 경우에는 가능한 한 많이 피해야한다고 말하고 싶습니다.

+0

확실한 답변을 보내 주셔서 감사합니다. Ladislav. 나는 당신의 주장에 동의하지 않으면 안됩니다. "가능한 한 많이 피하는 것이 좋습니다." 분명히, 이것에 대한 필요성이 있거나 그것을하는 방법에 대한 질문과 게시물은 결코 쓰여지지 않을 것입니다. 대부분의 엔티티 인스턴스에 대해 ObjectContext에 대한 참조를 가져 오는 방법이 있지만 비효율적입니다.특히 Entity Framework 모델에서 현재 지원되지 않는 데이터 관련 작업이 필요한 확장 메서드를 사용하여 개체 자체에서 개체의 컨텍스트를 검색하는 것이 바람직한 여러 가지 시나리오가 있습니다. –

0

이것은 내가 사용하는 것입니다. 이는 프로젝트에 추가하는 것이 쉬운 컨벤션 기반 방식입니다.

먼저 개체 컨텍스트에 후크를 추가

public partial class Database1Entities 
{ 
    partial void OnContextCreated() 
    { 
     this.ObjectMaterialized += (_, e) => 
     { 
      try 
      { 
       dynamic entity = e.Entity; 
       entity.ObjectContext = this; 
      } 
      catch (RuntimeBinderException) 
      { 
      } 
     }; 
     this.ObjectStateManager.ObjectStateManagerChanged += (_, e) => 
     { 
      if (e.Action == CollectionChangeAction.Add) 
      { 
       try 
       { 
        dynamic entity = e.Element; 
        entity.ObjectContext = this; 
       } 
       catch (RuntimeBinderException) 
       { 
       } 
      } 
      else if (e.Action == CollectionChangeAction.Remove) 
      { 
       try 
       { 
        dynamic entity = e.Element; 
        entity.ObjectContext = null; 
       } 
       catch (RuntimeBinderException) 
       { 
       } 
      } 
     }; 
    } 
} 

이 동적으로 개체 컨텍스트와 연관되는 실체에 ObjectContext라는 속성을 설정하려고 시도합니다.

다음, 엔티티 유형에 ObjectContext를 추가

public partial class Table1 
{ 
    /// <summary> 
    /// Gets or sets the context for this entity. 
    /// This should not be set by end-user code; this property will be set 
    /// automatically as entities are created or added, 
    /// and will be set to <c>null</c> as entities are detached. 
    /// </summary> 
    public Database1Entities ObjectContext { get; set; } 
} 

이 용액을 각 개체 유형에 추가 할 필요 ObjectContext 속성 않는다.

+0

답장을 보내 주셔서 감사합니다, 스티븐. 불행히도이 속성을 각 개체 유형에 추가하는 것은 단순히 실현 가능하거나 지속 가능하지 않습니다. –

+0

@ 존 :이 경우 연결된 속성을 사용하여 저의 다른 대답을보십시오. –

3

connected properties을 사용하는 다른 해결책이 있습니다. 이 (: 테스트되지 않은 코드 경고) : 같을 것이다 연결 속성을 사용

public partial class Database1Entities 
{ 
    private struct ObjectContextProperty { } 

    partial void OnContextCreated() 
    { 
     this.ObjectMaterialized += (_, e) => 
     { 
      e.Entity.GetConnectedProperty<Database1Entities, ObjectContextProperty>().Set(this); 
     }; 
     this.ObjectStateManager.ObjectStateManagerChanged += (_, e) => 
     { 
      if (e.Action == CollectionChangeAction.Add) 
      { 
       e.Element.GetConnectedProperty<Database1Entities, ObjectContextProperty>().Set(this); 
      } 
      else if (e.Action == CollectionChangeAction.Remove) 
      { 
       e.Element.GetConnectedProperty<Database1Entities, ObjectContextProperty>().Set(null); 
      } 
     }; 
    } 

    /// <summary> 
    /// Gets the object context for the entity. Returns <c>null</c> if the entity is detached. 
    /// </summary> 
    /// <param name="entity">The entity for which to return the object context.</param> 
    public static Database1Entities FromEntity(EntityObject entity) 
    { 
     return entity.GetConnectedProperty<Database1Entities, ObjectContextProperty>().GetOrConnect(null); 
    } 
} 

은 그럼 당신은 엔티티 개체에서 개체 컨텍스트를 얻을 수 Database1Entities.FromEntity를 사용할 수 있습니다. 당신은 또한뿐만 아니라 당신이 원하는 경우 엔티티 객체에 대한 실제 속성을 정의 할 수 있습니다

public partial class Table1 
{ 
    /// <summary> 
    /// Gets the object context for this entity. Returns <c>null</c> if the entity is detached. 
    /// </summary> 
    public Database1Entities ObjectContext { get { return Database1Entities.FromEntity(this); } } 
} 

를이 솔루션에서 ObjectContext 속성을 엔티티는 선택 사항입니다 오브젝트에.

+0

감사합니다. 연결된 속성을 조금 살펴보고이 프로젝트에 적합한 지 확인하십시오. 이 질문에 답해 주셔서 감사합니다. –

+0

좋은 방법, 또한 확장 메서드를 사용하여 GetObjectContext와 같은 메서드를 모든 entityObject에 추가 할 수 있습니다. public static Database1Entities GetObjectContext (이 EntityObject 엔티티 개체) { 반환 값 Database1Entities.FromEntity (entityObject); } – MNZ