为什么DbContext实现IObjectContextAdapter但没有公共ObjectContext属性

时间:2016-02-25 12:10:51

标签: entity-framework dbcontext interface-implementation

在实体框架中,DbContext类实现IObjectContextAdapter接口。当我查看这个界面时,我发现那里只有一个属性

ObjectContext ObjectContext {get;}

但是DbContext类本身并没有这个属性。现在:

  1. 它是如何工作的?不应该编译器强制DbContext类具有公共ObjectContext属性吗?
  2. 或换句话说:为什么我必须将DbContext强制转换为ObjectContextAdapter才能访问ObjectContext属性。
  3. 这里发生了什么?

1 个答案:

答案 0 :(得分:4)

这是显式接口实现的一个例子。

所以理论上理解它看这个例子

interface IExplicit
{
    void Explicit();
}

class Test : IExplicit
{
    void IExplicit.Explicit()
    {
     //some implementation goes here
    }
}

现在我们可以实例化一个新的Test(),但要访问IExplicit实现,我们必须转换类型

var testobj = new Test();

**will throw Compile time error.
testobj.Explicit();

**We can do.
((IExplicit)testobj).Explicit();

现在开始实际执行dbcontext

  

DbContext明确地实现了该属性。为了便于访问,必须将实例转换为其接口

public class DbContext : IObjectContextAdapter
{
    ObjectContext IObjectContextAdapter.ObjectContext 
    {
     get
        { 
         ... 
        }
    }
}

您可以在msdn上找到明确的界面文档。