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

时间:2014-09-13 08:56:18

标签: c# entity-framework generics

我试图覆盖DbContext.Set<TEntity>() method

它的签名是:

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

首先我尝试了这个:

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

...但我收到错误:

  

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

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

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

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

  

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

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

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

2 个答案:

答案 0 :(得分:8)

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

在6.0.0中(在挖掘history of the project on Code Plex之后,我发现Set<TEntity>() 不是 virtual返回然后

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

无论如何,将实体框架更新到6.1.x(其中 virtual),解决了问题;

Update-Package EntityFramework

答案 1 :(得分:1)

请你发一整课。

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

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

请确保您使用的是最新的Entity Framework(6.X)