Можно ли адаптировать этот класс TestDBSet из EF 6 для работы с EF Core? - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь написать свои собственные двойники теста для пробного тестирования ядра Entity Framework, следуя этому руководству для EF 6:

https://docs.microsoft.com/en-us/ef/ef6/fundamentals/testing/writing-test-doubles

Учебник застрял в классе TestDbSet,который должен обеспечить реализацию DbSet в памяти.Однако большинство участников несовместимы с EF Core:

public class TestDbSet<TEntity> : DbSet<TEntity>, IQueryable, IEnumerable<TEntity>, IDbAsyncEnumerable<TEntity>
    where TEntity : class
{
    ObservableCollection<TEntity> _data;
    IQueryable _query;

    public TestDbSet()
    {
        _data = new ObservableCollection<TEntity>();
        _query = _data.AsQueryable();
    }

    public override TEntity Add(TEntity item)
    {
        _data.Add(item);
        return item;
    }

    public override TEntity Remove(TEntity item)
    {
        _data.Remove(item);
        return item;
    }

    public override TEntity Attach(TEntity item)
    {
        _data.Add(item);
        return item;
    }

    public override TEntity Create()
    {
        return Activator.CreateInstance<TEntity>();
    }

    public override TDerivedEntity Create<TDerivedEntity>()
    {
        return Activator.CreateInstance<TDerivedEntity>();
    }

    public override ObservableCollection<TEntity> Local
    {
        get { return _data; }
    }

    Type IQueryable.ElementType
    {
        get { return _query.ElementType; }
    }

    Expression IQueryable.Expression
    {
        get { return _query.Expression; }
    }

    IQueryProvider IQueryable.Provider
    {
        get { return new TestDbAsyncQueryProvider<TEntity>(_query.Provider); }
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return _data.GetEnumerator();
    }

    IEnumerator<TEntity> IEnumerable<TEntity>.GetEnumerator()
    {
        return _data.GetEnumerator();
    }

    IDbAsyncEnumerator<TEntity> IDbAsyncEnumerable<TEntity>.GetAsyncEnumerator()
    {
        return new TestDbAsyncEnumerator<TEntity>(_data.GetEnumerator());
    }
}

Ошибка, возникающая для методов Add, Attach, Remove и Create, одинакова для всех четырех:

'TestDbSet .Add (TEntity)': тип возвращаемого значения должен быть 'EntityEntry ', чтобы соответствовать переопределенному члену 'DbSet .Add (TEntity)

Кто-нибудь будетсмог объяснить, могу ли я преобразовать в EntityEntry или есть ли лучший способ обойти проблему?Большое спасибо

1 Ответ

0 голосов
/ 19 февраля 2019

Для EntityEntry<TEntity>, он указывает отслеживаемый TEntity и проверяет исходный код, он использовал StateManager для преобразования TEntity в EntityEntry<TEntity>.

Вы не можете создать StateManager в вашем TestDbSet<TEntity>.

Попробуйте проверить, работает ли код ниже для вас.

public class TestDbSet<TEntity> : DbSet<TEntity>, IQueryable, IEnumerable<TEntity>
    where TEntity : class
{
    ObservableCollection<TEntity> _data;
    IQueryable _query;

    public TestDbSet()
    {
        _data = new ObservableCollection<TEntity>();
        _query = _data.AsQueryable();
    }

    public override EntityEntry<TEntity> Add(TEntity item)
    {
        _data.Add(item);
        var entity = base.Attach(item);
        return entity;
    }
}
...