2012-10-26 3 views
2

DbContext.ObjectContext에 직접 전화 할 수없는 이유는 무엇입니까? 나는이 ((IObjectContextAdapter)context).ObjectContextDbContext.ObjectContext를 직접 호출 할 수없는 이유는 무엇입니까?

내가 내부 메커니즘은 내가 IEnumerable<T> 상속 IEnumerable 인하기 전에이 문제를 충족이

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestClass t = new TestClass(); 
     ((TestInterface)t).TestMethod(); 
     // I can't call t.TestMethod() 
     Console.ReadKey(); 
    } 
} 

public interface TestInterface 
{ 
    void TestMethod(); 
} 

public class TestClass : TestInterface 
{ 
    void TestInterface.TestMethod() 
    { 
     Console.WriteLine("abcdefg"); 
    } 
} 

같은 인터페이스의 암시 적으로 구현 생각 할 수있는, 그것은 일반 버전 IEnumerator<T> GetEnumerator() 및 제네릭이 아닌이있다 버전 IEnumerator GetEnumerator()이지만 일반이 아닌 일반 전화 만 호출 할 수 있습니다. 그 이유는 비 제네릭 타입이 타입에 안전하지 않고 작성자가 그것을 숨기고 싶어하기 때문입니다.

하지만 DbContext 클래스의 이유는 무엇입니까?

+0

IEnumerable을 IEnumerable 으로 변환하려면 OfType 또는 캐스트 을 호출해야합니다. – Pawel

답변

1

ObjectContext이 (가) DbContext으로 대체되어 사용되지 않았을 것으로 예상됩니다. DbContextObjectContext보다 훨씬 쾌적한 API입니다.

+1

나는 ObjectContext가 더 이상 사용되지 않는다고 말하지는 않겠지 만 DbContext를 사용하는 것이 더 쉽기 때문에 사용하는 것이 바람직합니다. DbContext는 ObjectContext 위에 구축되어 있으므로, DbContext로 할 수없는 것이 있습니다 만, 인터페이스에서는 ObjectContext 인스턴스를 취득 해 이러한 일을 달성 할 수 있습니다 – Pawel

5

ObjectContext는 DbContext 클래스 (MSDN - DbContext에 나와 있음)에 명시 적으로 구현되어 있으므로 속성을 호출하려면 개체를 인터페이스에 명시 적으로 캐스팅해야합니다.

는 "회원이 명시 적으로 구현 될 때,하지만 인터페이스의 인스턴스를 통해, 클래스 인스턴스를 통해 액세스 할 수 없습니다."-이 도움이 MSDN - Explicit Interface Implementation Tutorial

희망!

0

Codeplex에서 사용할 수있는 DbContext 클래스의 소스 코드를 확인하면 ObjectContext 속성이 명시 적으로 구현됩니다.

ObjectContext IObjectContextAdapter.ObjectContext 
     { 
      get 
      { 
       InternalContext.ForceOSpaceLoadingForKnownEntityTypes(); 
       return InternalContext.ObjectContext; 
      } 
     } 

이 당신이 IObjectContextAdapter에 캐스팅없이 DbContext의 객체를 사용하여 속성 ObjectContext를 호출 할 수 없습니다 이유입니다 : 여기에 (내가 코멘트를 제거한) 소스에서 코드의 조각이다 유형.

관련 문제