从接口继承时如何使用派生类

本文关键字:何使用 派生 接口 继承 | 更新日期: 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>