未实现IDbAsyncEnumerable [英] IDbAsyncEnumerable not implemented

查看:192
本文介绍了未实现IDbAsyncEnumerable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用FakeDbSet制作FakeDbContext进行单元测试。



但是出现以下错误(请参见下文)。我正在扩展DbSet,因此通常应实现IDbAsyncEnumerable。当我实现它时,它说它没有用。



例外:


System.InvalidOperationException:源IQueryable没有
实现
IDbAsyncEnumerable。只有实现IDbAsyncEnumerable的
源可用于实体
框架异步操作。有关更多详细信息,请参见
http://go.microsoft.com/fwlink/?LinkId = 287068


FakeDbSet类:

 公共抽象类FakeDbSet< TEntity> :DbSet< TEntity>,IEnumerable< TEntity>,IQueryable,IDbAsyncEnumerable< TEntity>。其中TEntity:实体,new()
{
#region私有字段
私有readobservableCollection< TEntity> _items;
private readonly IQueryable _query;
#endregion私有字段

受保护的FakeDbSet()
{
_items = new ObservableCollection< TEntity>();
_query = _items.AsQueryable();
}

public Expression Expression {获取{return _query.Expression; }}

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

public IQueryProvider Provider {get {return _query.Provider; }}

公共替代TEntity Add(TEntity实体)
{
_items.Add(entity);
个返回实体;
}

公共重写TEntity Remove(TEntity实体)
{
_items.Remove(entity);
个返回实体;
}

公共重写TEntity Attach(TEntity实体)
{
开关(entity.ObjectState)
{
case ObjectState.Modified:
_items.Remove(entity);
_items.Add(entity);
休息时间;

case ObjectState.Deleted:
_items.Remove(entity);
休息时间;

case ObjectState。未更改:
case ObjectState.Added:
_items.Add(entity);
休息时间;

默认值:
throw new ArgumentOutOfRangeException();
}
个返回实体;
}

公共重写TEntity Create(){返回新的TEntity(); }

公共替代TDerivedEntity Create< TDerivedEntity>(){return Activator.CreateInstance< TDerivedEntity>(); }

公共替代ObservableCollection< TEntity>本地{get {return _items; }}

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

类型IQueryable.ElementType
{
get {return _items.AsQueryable()。ElementType; }
}

表达式IQueryable.Expression
{
get {return _items.AsQueryable()。Expression; }
}

IQueryProvider IQueryable.Provider
{
get {return _items.AsQueryable()。Provider; }
}

以下是该代码的要点。在要点的最后一个文件中,即发生错误的地方。
要点代码

解决方案

在与异常消息一起提供的链接中明确提到了您的方案( http://go.microsoft.com/fwlink/?LinkId=287068 )。缺少的成分是IDbAsyncQueryProvider,您应该从Provider属性中返回。



只需通过链接进行导航即可到达样板实现



我可以补充一点,我只引用基本短语:


为了使用异步查询,我们需要做更多的工作。如果我们尝试将Moq DbSet与GetAllBlogsAsync方法一起使用,则会出现以下异常:



System.InvalidOperationException:源IQueryable没有实现IDbAsyncEnumerable。只有实现IDbAsyncEnumerable的源才能用于Entity Framework异步操作。有关更多详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=287068 。。 p>

为了使用异步方法,我们需要创建一个内存中的DbAsyncQueryProvider来处理异步查询。尽管可以使用Moq设置查询提供程序,但是用代码创建测试双重实现要容易得多。此实现的代码如下:



等...



I am trying to make a FakeDbContext with a FakeDbSet for unit testing.

But I get the following error (see below). I am extending DbSet so normally IDbAsyncEnumerable should be implemented. And when I implement it, it says that it has no use.

Exception:

System.InvalidOperationException: The source IQueryable doesn't implement IDbAsyncEnumerable. Only sources that implement IDbAsyncEnumerable can be used for Entity Framework asynchronous operations. For more details see http://go.microsoft.com/fwlink/?LinkId=287068.

FakeDbSet class:

public abstract class FakeDbSet<TEntity> : DbSet<TEntity>, IEnumerable<TEntity>, IQueryable, IDbAsyncEnumerable<TEntity> where TEntity : Entity, new()
{
    #region Private Fields
    private readonly ObservableCollection<TEntity> _items;
    private readonly IQueryable _query;
    #endregion Private Fields

    protected FakeDbSet()
    {
        _items = new ObservableCollection<TEntity>();
        _query = _items.AsQueryable();
    }

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

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

    public IQueryProvider Provider { get { return _query.Provider; } }

    public override TEntity Add(TEntity entity)
    {
        _items.Add(entity);
        return entity;
    }

    public override TEntity Remove(TEntity entity)
    {
        _items.Remove(entity);
        return entity;
    }

    public override TEntity Attach(TEntity entity)
    {
        switch (entity.ObjectState)
        {
            case ObjectState.Modified:
                _items.Remove(entity);
                _items.Add(entity);
                break;

            case ObjectState.Deleted:
                _items.Remove(entity);
                break;

            case ObjectState.Unchanged:
            case ObjectState.Added:
                _items.Add(entity);
                break;

            default:
                throw new ArgumentOutOfRangeException();
        }
        return entity;
    }

    public override TEntity Create() { return new TEntity(); }

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

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

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

    Type IQueryable.ElementType
    {
        get { return _items.AsQueryable().ElementType; }
    }

    Expression IQueryable.Expression
    {
        get { return _items.AsQueryable().Expression; }
    }

    IQueryProvider IQueryable.Provider
    {
        get { return _items.AsQueryable().Provider; }
    }

Here is a gist with the code. In the last file in the gist, that is where the error happens. Gist code

解决方案

Your scenario is explicitly mentioned in the link provided with the exception message (http://go.microsoft.com/fwlink/?LinkId=287068). The missing ingredient is the IDbAsyncQueryProvider that you should return from your Provider property.

Just navigate through the link to arrive at the boilerplate implementation.

Little I can add, I'll just quote the essential phrase:

In order to use asynchronous queries we need to do a little more work. If we tried to use our Moq DbSet with the GetAllBlogsAsync method we would get the following exception:

System.InvalidOperationException: The source IQueryable doesn't implement IDbAsyncEnumerable. Only sources that implement IDbAsyncEnumerable can be used for Entity Framework asynchronous operations. For more details see http://go.microsoft.com/fwlink/?LinkId=287068.

In order to use the async methods we need to create an in-memory DbAsyncQueryProvider to process the async query. Whilst it would be possible to setup a query provider using Moq, it is much easier to create a test double implementation in code. The code for this implementation is as follows:

etc...

这篇关于未实现IDbAsyncEnumerable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆