昨天,在处理一些实体框架时,我尝试写这个,并得到错误" ObjectContext不是会员"等
context.ObjectContext.Refresh(RefreshMode.StoreWins, myObject);
现在, context 继承了DbContext对象,在此处记录:http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.103).aspx
这是""的正常继承。 type - 我的上下文对象是一个 DbContext 对象。 DbContext类实现 IObjectContextAdapter 接口,所以我希望上面的代码可以工作 - 接口声明的成员函数需要在DbContext类中实现,否则我会期望它失败使用"编译你必须实现接口"错误。但是,当我们查看生成的类定义时,它就不存在了!
最终,我实现了这样的调用,编译器接受了这个调用。
((IObjectContextAdapter)context).ObjectContext.Refresh(RefreshMode.StoreWins, myObject);
任何人都可以解释为什么我必须这样做,当下面的代码是相同的情况并且工作正常?
interface IMyInterface {
int MyInterfaceMemberFunction();
}
public class MyObjectClass : IMyInterface {
public int MyInterfaceMemberFunction() { return 17; }
}
public class MyTestClass {
public int MyTestFunction() {
MyObjectClass m = new MyObjectClass();
return m.MyInterfaceMemberFunction(); //error here for EF context
}
}
答案 0 :(得分:1)
这是因为ObjectContext
属性为explicitly implemented。要使用您的示例来演示它:
interface IMyInterface {
int MyInterfaceMemberFunction();
}
public class MyObjectClass : IMyInterface {
// this line changed:
int IMyInterface.MyInterfaceMemberFunction() { return 17; }
}
public class MyTestClass {
public int MyTestFunction() {
MyObjectClass m = new MyObjectClass();
//return m.MyInterfaceMemberFunction(); //error here
return ((IMyInterface)m).MyInterfaceMemberFunction(); //this works
}
}
如果您有两个定义具有相同名称的不同成员的接口,则必须进行显式实现。它也可以用来隐藏某些界面成员,如果你希望它们不被正常使用你的班级的人注意到。例如,List<T>
实现了IList
,但是明确地实现了IList.Add(object)
,这样您就不会意外地尝试向T
添加除List<T>
之外的任何内容。