【问题标题】:Overriding virtual method with generics and constraints用泛型和约束覆盖虚拟方法
【发布时间】:2014-09-13 08:56:17
【问题描述】:

我正在尝试覆盖DbContext.Set<TEntity>() method

它的签名是:

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()”中用作参数“TEntity”

...所以我尝试将其指定为引用类型:

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

...我现在得到:

覆盖和显式接口实现方法的约束是从基方法继承的,所以不能直接指定。

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

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

【问题讨论】:

    标签: c# entity-framework generics


    【解决方案1】:

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

    在 6.0.0 中(在挖掘了 history of the project on Code Plex 之后,我发现 Set&lt;TEntity&gt;() 当时不是 virtual

    可惜编译器不能这么说,而不是让我到处转转。

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

    Update-Package EntityFramework
    

    【讨论】:

    • 不错的发现。再次遇到此类问题的提示:您始终可以在base.Set 中右键单击“设置”并在 Visual Studio 中选择“转到定义”,即使您没有在本地安装实体框架源代码。在那里,您会看到该方法不是虚拟的。并同意编译器应该给出有用的信息。
    【解决方案2】:

    能否请您发布整个课程。

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

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

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

    【讨论】:

    • 谢谢,这让我走上了正轨;一旦我删除了类中的其余代码,编译器就会将其消息更改为“Set&lt;TEntity&gt;() 不是virtual;请参阅我的回答以了解接下来发生的事情......我没有 +1 的代表,但我认为这不值得-2 :(.
    • 为什么我的回答失败了?需要我们帮忙吗?
    • 确保您使用的是正确的版本。我正在使用 EF 6.X
    • 我没有赞成或反对票的声誉:(。不是我!:(。
    • 他们甚至引入了 IDbContext 以便您可以自动化单元测试。
    猜你喜欢
    • 2016-11-28
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2014-03-18
    • 2016-06-06
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多