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

时间:2016-02-26 06:07:20

标签: c# entity-framework

我尝试像这样创建我的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

你能告诉我为什么吗?我该如何解决这个问题呢?

非常感谢你。

1 个答案:

答案 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>