为什么我不能直接调用DbContext.ObjectContext?

时间:2012-10-26 15:06:23

标签: c# entity-framework

为什么我不能直接拨打DbContext.ObjectContext?我可以这样做((IObjectContextAdapter)context).ObjectContext

我认为内部机制是像这样

的隐式实现接口
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"); 
    } 
}

我遇到此问题之前IEnumerable<T>继承IEnumerable,它具有通用版本IEnumerator<T> GetEnumerator()和非通用版本IEnumerator GetEnumerator(),但您只能调用通用一个而不是非一般的。这是因为非泛型的不是类型安全的,作者想隐藏它。

但是DbContext类的原因是什么?

3 个答案:

答案 0 :(得分:5)

因为ObjectContext是在DbContext类中显式实现的(如MSDN - DbContext所示),所以你必须将对象显式地转换为接口来调用属性。

“当显式实现成员时,不能通过类实例访问它,而只能通过接口的实例访问它。” - MSDN - Explicit Interface Implementation Tutorial

希望这有帮助!

答案 1 :(得分:1)

我怀疑,因为ObjectContext已弃用DbContextDbContext是一个比ObjectContext更令人愉快的API。

答案 2 :(得分:0)

如果检查Codeplex上可用的DbContext类的源代码,则显式实现ObjectContext属性。以下是源代码(我删除了注释):

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

这就是为什么你不能使用DbContext的对象调用属性ObjectContext而不将其转换为IObjectContextAdapter类型的原因。