Возможность обнуления EF Core 3.1 в ограничениях для проблемы параметра типа с интерфейсом и DbContext

У меня есть проект сборки .NET Core 3.1 с использованием EF Core 3.1, в котором включены ссылочные типы, допускающие значение NULL. Я создал следующий интерфейс:

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

Я реализую этот интерфейс в своем классе контекста:

public sealed class MyDbContext : DbContext, IMyDbContext
{
}

Поскольку в базовом классе DbContext уже есть метод с этой сигнатурой, мне фактически не нужно ничего реализовывать в классе MyDbContext.

Я получаю следующее предупреждение:

Возможность обнуления в ограничениях для параметра типа 'TEntity' метода 'DbSet Microsoft.EntityFrameworkCore.DbContext.Set ()' не соответствует ограничениям для параметра типа 'T' метода интерфейса 'DbSet MyProject.IMyDbContext.Set ()'. Вместо этого рассмотрите возможность использования явной реализации интерфейса.

Я подтвердил, что это вызвано тем, что мой проект использует ссылочные типы, допускающие значение NULL, а EF Core не удаляет из файла проекта следующее:

<Nullable>enable</Nullable>

Как только я это сделал, предупреждение исчезло.

Я пытался изменить интерфейс следующим образом:

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

Но не повезло.

Есть ли способ убрать это предупреждение, не удаляя из моего проекта ссылочные типы, допускающие значение NULL?


person Ken Brannigan    schedule 21.12.2019    source источник
comment
Ошибка исчезнет, ​​если отключить ссылочные типы, допускающие значение NULL?   -  person devNull    schedule 22.12.2019
comment
@devNull да, ошибка исчезнет, ​​если я удалю ссылочные типы, допускающие значение NULL. Я обновлю сообщение, чтобы указать на это.   -  person Ken Brannigan    schedule 22.12.2019
comment
У меня такая же проблема. Я пробовал установить, где TEntity: class? также, но не решило проблему.   -  person Ristogod    schedule 17.01.2020


Ответы (2)


Поэтому я отказываюсь признать, что это предупреждение даже верно, потому что после всех исследований кажется, что мой интерфейс 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
person Ristogod    schedule 17.01.2020

Я встретил ту же проблему, решил ее переопределением метода 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>();
    }
}

Предупреждение пропало, студия предлагает удалить метод, но я конечно не буду этого делать =)

Если есть другое решение, буду признателен

person Алексей Добров    schedule 08.05.2020