使用泛型和约束覆盖虚方法

Fra*_*e B 9 c# generics entity-framework

我试图覆盖该DbContext.Set<TEntity>()方法.

它的签名是:

public virtual DbSet<TEntity> Set<TEntity>() where TEntity : class
Run Code Online (Sandbox Code Playgroud)

首先我尝试了这个:

public override DbSet<TEntity> Set<TEntity>()
{
    return base.Set<TEntity>();
}
Run Code Online (Sandbox Code Playgroud)

...但我收到错误:

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

...所以我尝试指定它是一个引用类型:

public override DbSet<TEntity> Set<TEntity>() where TEntity: class
{
    return base.Set<TEntity>();
}
Run Code Online (Sandbox Code Playgroud)

......我现在得到:

覆盖和显式接口实现方法的约束是从base方法继承的,因此不能直接指定它们.

......如果我拿走它,我会回到第一个错误.

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

Fra*_*e B 8

这是蹩脚的......我使用的是6.0.0版的Entity Framework.

在6.0.0中(在对Code Plex项目历史进行深入研究之后,我发现Set<TEntity>() 当时并非 virtual如此.

羞辱编译器不能这么说,而不是把我送到房子周围.

无论如何,将实体框架更新到6.1.x(它所在的位置 virtual),解决了这个问题;

Update-Package EntityFramework
Run Code Online (Sandbox Code Playgroud)

  • 很好找.如果您再次遇到这样的问题,请提示:您可以随时右键单击`base.Set`中的"Set"并在Visual Studio中选择"Go to definition",即使您没有安装Entity Framework源代码也是如此本地.在那里,你会看到该方法不是虚拟的.并同意编译器应该提供有用的消息. (2认同)