【问题标题】:Entity Framework 7 Create in-memory implementation of DbSetEntity Framework 7 创建 DbSet 的内存实现
【发布时间】:2016-12-11 21:07:05
【问题描述】:

对不起,我是实体框架的新手..

我想创建一个 TestDbSet,它在 EF 7 中提供 DbSet 的内存实现。

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; 
        } 
 }

我在 Add 方法中遇到错误,返回类型必须是 EntityEntry&lt;T&gt; 才能匹配 Overriden Dbset 成员。

我尝试更改方法签名,但我不确定如何将项目返回为 EntityEntry

 public override EntityEntry<T> Add(T item) 
        {
           _data.Add(item);
            return  item;
        }

我找不到类似的问题。你能指导我如何在 EF 7 中实现.. 我知道它将在 EF 6 中工作..

【问题讨论】:

  • 你想用这个实现做什么?
  • 用于单元测试..
  • 我认为最好创建一个继承自 List 或 Collection 的 DbSet,您还将处理生成值的行为,例如 SqlSever 中的 Identity
  • 我无法清楚地了解您。如果我只是继承 List 我怎么能覆盖 Save , Add 等。你能用示例解释一下吗..

标签: c# asp.net entity-framework entity-framework-core


【解决方案1】:

对于没有真实数据库的测试,您可以use Microsoft.EntityFrameworkCore.InMemory

【讨论】:

  • 是的,内存工作正常。但我想模拟我的 DBSet,并且我有批量更新,我正在使用存储过程。
  • 你会从 DbContext 获得EntityEntry。您不能在不涉及 DbContext 的情况下使用 DbSet,因为 DbSet 是上下文的一部分。在您的代码 sn-p 中,您没有在任何地方涉及上下文。因此,如果您不想使用问题 cmets 中建议的上下文,最好从 List 或 collection 继承。
  • @Smit :我试图在 EF 7 中复制此 [Sample](msdn.microsoft.com/en-us/library/dn314431(v=vs.113).aspx),但我无法覆盖 TestDbset 类中的 dbset 方法。让我知道如何实现返回 EntityEntry ..
  • EF6 和 EF 核心完全不同。鉴于DbSet&lt;T&gt;上函数返回类型的变化,适用于EF6的文章无法移植。鉴于 DbSet 使用内部类型和与上下文的紧密耦合,此时最好的选择是使用 EF.InMemory 包。如果您想添加更多功能,可以从该包扩展。
【解决方案2】:

对不起,我知道这是一个非常古老的线程。但想想这是否有帮助。我设法通过返回 null 来覆盖 EF Core 的 Add 方法。由于我们只是列表中的数据项,因此除非您需要 ChangeTracking 对象,否则我们是否返回 null 并不重要。

    public override EntityEntry<T> Add(T item)
    {
        _data.Add(item);

        return null;
    }

【讨论】:

    【解决方案3】:

    我用下面的代码解决了

     public override EntityEntry<T> Add(T item) 
     {
               _data.Add(item);
                return item as EntityEntry<T>;
     }
    

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2016-04-12
      • 1970-01-01
      • 2019-03-09
      • 2013-12-28
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多