用泛型和约束重写虚拟方法

本文关键字:虚拟 方法 重写 约束 泛型 | 更新日期: 2023-09-27 18:21:47

我正在尝试覆盖DbContext.Set<TEntity>()方法。

它的签名是:

public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class

首先我尝试了这个:

public override DbSet<TEntity> Set<TEntity>()
{
    return base.Set<TEntity>();
}

但我得到了错误:

类型"TEntity"必须是引用类型,才能将其用作泛型类型或方法"System.Data.Entity.DbContext.Set()"中的参数"TEntiity"

所以我试着把它指定为一个引用类型:

public override DbSet<TEntity> Set<TEntity>() where TEntity: class
{
    return base.Set<TEntity>();
}

我现在得到:

重写和显式接口实现方法的约束是从基方法继承的,因此不能直接指定它们。

如果我把它拿走,我又回到了第一个错误。

那么C#编译器希望我做什么呢?

用泛型和约束重写虚拟方法

这太蹩脚了。。。我使用的是实体框架6.0.0版本。

在6.0.0中(在CodePlex上挖掘项目历史后,我发现Set<TEntity>()当时不是virtual

遗憾的是,编纂者没有这么说,而是派我四处打听。

无论如何,将Entity Framework更新到6.1.x(其中virtual)解决了问题;

Update-Package EntityFramework

你能发布一整节课吗。

以下是我的使用方法,我可以毫无问题地进行编译。

public class MyDBContext : DbContext
{
    public override DbSet<TEntity> Set<TEntity>()
    {
        return base.Set<TEntity>();
    }
}

请确保您使用的是最新的实体框架(6.X)