从接口继承时如何使用派生类
本文关键字:何使用 派生 接口 继承 | 更新日期: 2023-09-27 18:36:29
我尝试像这样创建我的 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
你能告诉我为什么吗?我该如何解决这个问题?
非常感谢。
接口实现必须与接口定义完全匹配。因此,不能在接口上将属性类型化为 IQueryable<T>
,并使用类上键入为 DbSet<T>
的属性来实现它。
使用显式接口实现来解决此问题:
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; } }
}
如您所见,我从界面中删除了二传手。这是因为否则您将需要额外的类型检查,因为有很多类实现了IQueryable<Product>
但无法分配给DbSet<Product>
。