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中,即使您没有在本地安装实体框架源代码。在那里,您会看到该方法不是虚拟的。并且同意编译器应该提供有用的消息。