public interface IDatabaseContext : IDisposable {
IDbSet<MyEntity1> Entities1 { get; set; }
}
public class MyDbContext : DbContext, IDatabaseContext {
IDbSet<MyEntity1> Entities1 { get; set; }
}
由于此处描述的错误无法编译:http://msdn.microsoft.com/en-Us/library/bb384253(v=vs.90).aspx
然而,这没有任何意义,因为界面显然是公开的。这可能是什么错误?
然而,这没有任何意义,因为界面显然是公开的。这可能是什么错误?
不,不是。默认情况下,课程成员是private
。这个Entities1
是私人的:
public class MyDbContext : DbContext, IDatabaseContext {
IDbSet<MyEntity1> Entities1 { get; set; }
}
请注意,这与interface
s不同,其中一切都是public
,访问修饰符没有意义。所以:要么成为成员public
:
public class MyDbContext : DbContext, IDatabaseContext {
public IDbSet<MyEntity1> Entities1 { get; set; }
}
或者做一个明确的接口实现:
public class MyDbContext : DbContext, IDatabaseContext {
IDbSet<MyEntity1> IDatabaseContext.Entities1 { get; set; }
}
在类中实现接口成员时,它应该是public
见:Interfaces (C# Programming Guide)
要实现接口成员,实现类的相应成员必须是公共的,非静态的,并且具有与接口成员相同的名称和签名。
public class MyDbContext : DbContext, IDatabaseContext {
public IDbSet<MyEntity1> Entities1 { get; set; }
}
或者@Marc Gravell在评论中说你可以做Explicit interface implemenation,更多可以在this answer找到
简化答案/逻辑 -
您的问题是接口在继承类中是公共的(这就是它被称为接口的原因)。
因此,您必须将派生类中的实现标记为public(在MyDbContext中)。
我有同样的问题才发现我忘了将界面的方法公之于众。确保界面的所有方法都是公开的。
接口成员也可以实现为受保护。如果你不想要我们可以在抽象类的情况下将它作为抽象。