2

我有一个使用 EF Core 3.1 的 .NET Core 3.1 程序集项目,它启用了可为空的引用类型。我创建了以下界面:

public interface IMyDbContext
{
      DbSet<TEntity> Set<TEntity>() where TEntity : class;
}

我在我的上下文类中实现了这个接口:

public sealed class MyDbContext : DbContext, IMyDbContext
{
}

由于 DbContext 基类已经有一个带有这个签名的方法,我实际上不需要在 MyDbContext 类中实现任何东西。

我收到以下警告:

方法“DbSet Microsoft.EntityFrameworkCore.DbContext.Set()”的类型参数“TEntity”的约束为空性与接口方法“DbSet MyProject.IMyDbContext.Set()”的类型参数“T”的约束不匹配。考虑改用显式接口实现。

我确认这是由我的项目使用可为空的引用类型引起的,而 EF Core 并没有通过从项目文件中删除以下内容:

<Nullable>enable</Nullable>

一旦我这样做了,警告就消失了。

我尝试将界面更改如下:

DbSet<TEntity> Set<TEntity>() where TEntity : class?;

但没有运气。

有没有办法让这个警告消失而不从我的项目中删除可为空的引用类型?

4

2 回答 2

0

所以我拒绝接受这个警告是真的,因为经过所有调查,我的 IDbContext 接口似乎与 Microsoft.EntityFrameworkCore.DbContext 实现该方法的方式完全匹配。

因此,为了处理警告的误报性质,我不情愿地将我的代码更改为我的“修复”。

/// <inheritdoc cref="Microsoft.EntityFrameworkCore.DbContext"/>
/// <inheritdoc cref="IDbContext"/>
#pragma warning disable 8633
public abstract partial class DbContext : Microsoft.EntityFrameworkCore.DbContext, IDbContext
#pragma warning restore 8633
于 2020-01-17T15:51:44.587 回答
0

我遇到了同样的问题,通过覆盖 Set 方法解决了

public interface IApplicationDbContext
{
    DbSet<TEntity> Set<TEntity>() where TEntity : class;
}

public class ApplicationDbContext : DbContext, IApplicationDbContext
{

    public ApplicationDbContext(DbContextOptions options) : base(options)
    { }

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

警告没了,studio建议可以去掉这个方法,不过我当然不会这样做=)

如果有其他解决方案,我将不胜感激

于 2020-05-08T10:32:40.637 回答