【发布时间】:2014-12-05 10:14:32
【问题描述】:
我正在尝试使用 FakeDbSet 制作 FakeDbContext 以进行单元测试。
但我收到以下错误(见下文)。我正在扩展 DbSet,所以通常应该实现 IDbAsyncEnumerable。而且当我实现它时,它说它没有用。
例外:
System.InvalidOperationException:源 IQueryable 没有 实施 IDbAsyncEnumerable。仅有的 实现 IDbAsyncEnumerable 的源可用于实体 框架异步操作。有关更多详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=287068.
FakeDbSet 类:
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; }
}
这是代码的要点。在要点的最后一个文件中,这就是发生错误的地方。 Gist code
【问题讨论】:
-
添加了一种快速简便的方法:stackoverflow.com/a/68103942/661933
-
使用:using Microsoft.EntityFrameworkCore;并删除using System.Data.Entity;
标签: c# entity-framework