C# 用泛型和约束重写虚方法

C# 用泛型和约束重写虚方法,c#,entity-framework,generics,C#,Entity Framework,Generics,我正试着去推翻这个命令 签名是: public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class public virtual DbSet Set(),其中tenty:class 首先,我尝试了这个: public override DbSet<TEntity> Set<TEntity>() { return base.Set<TEntity>(); }

我正试着去推翻这个命令

签名是:

public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class
public virtual DbSet Set(),其中tenty:class
首先,我尝试了这个:

public override DbSet<TEntity> Set<TEntity>()
{
    return base.Set<TEntity>();
}
public override DbSet Set()
{
返回base.Set();
}
。。。但我得到了一个错误:

类型“tenty”必须是引用类型,才能在泛型类型或方法“System.Data.Entity.DbContext.Set()”中将其用作参数“tenty”

。。。然后我尝试指定它是引用类型:

public override DbSet<TEntity> Set<TEntity>() where TEntity: class
{
    return base.Set<TEntity>();
}
public override DbSet Set(),其中tenty:class
{
返回base.Set();
}
。。。我现在得到:

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

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


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

你能发布一个完整的类吗

下面是我如何使用的,我可以毫无问题地编译

public class MyDBContext : DbContext
{
    public override DbSet<TEntity> Set<TEntity>()
    {
        return base.Set<TEntity>();
    }
}
公共类MyDBContext:DbContext
{
公共覆盖数据库集()
{
返回base.Set();
}
}

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

好吧,这是很蹩脚的。。。我使用的是实体框架的6.0.0版

在6.0.0中(在深入研究之后,我发现,
Set()
当时不是虚拟的

遗憾的是,编辑不能这么说,而不是派我四处走走

无论如何,将Entity Framework更新为6.1.x(其中它是
虚拟的
),解决了这个问题

Update-Package EntityFramework

谢谢,这让我走上了正确的轨道;当我删除了类中的其余代码后,编译器将其消息更改为“
Set()
不是
virtual
;请查看我接下来的答案……我没有+1的代表,但我认为这不值得使用-2:(为什么我的答案下降了?你想让我们帮忙吗?确保你使用的是正确的版本。我用EF6XI没有投票或倒票的名声:(不是我!)(.他们甚至引入了IDbContext,这样你就可以自动进行单元测试了。这是一个不错的发现。如果你再次遇到这样的问题,这是一个提示:你可以在
base.Set
中右键单击“Set”,然后选择“转到定义”“在Visual Studio中,即使您没有在本地安装实体框架源代码。在那里,您会看到该方法不是虚拟的。并且同意编译器应该提供有用的消息。