我尝试像这样创建我的DbContext:
public interface IMyDbContext
{
IQueryable<Product> Products { get; set; }
}
public class MyDbContext: DbContext, IMyDbContext
{
public DbSet<Product> Products { get; set; }
}
我不想在界面中使用IDbSet
,因为该类在另一个不使用EntityFramework的项目中使用。
Visual Studio说MyDbContext
没有实现成员IQueryable<Product>
,但DbSet<Product>
来自IQueryable<Product>
:https://msdn.microsoft.com/en-us/library/gg696460(v=vs.113).aspx
你能告诉我为什么吗?我该如何解决这个问题呢?
非常感谢你。
答案 0 :(得分:4)
接口实现必须与接口定义完全匹配。因此,您无法在界面上键入属性为IQueryable<T>
的属性,并在类上使用DbSet<T>
类型的属性实现它。
使用explicit interface implementation解决这个问题:
public interface IMyDbContext
{
IQueryable<Product> Products { get; }
}
public class MyDbContext: DbContext, IMyDbContext
{
public DbSet<Product> Products { get; set; }
IQueryable<Product> IMyDbContext.Products { get { return Products; } }
}
如您所见,我从界面中删除了setter。这是因为否则您需要额外的类型检查,因为有很多类实现IQueryable<Product>
但不能分配给DbSet<Product>
。