标签: dbset

如何将项添加到Mock DbSet(使用Moq)

我正在尝试设置一个模拟DbSet用于测试目的.我在这里使用了这个教程,http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/并略微修改了它,所以每次调用GetEnumerator都会返回一个新的枚举器(我遇到的另一个问题) .但是,我在向DbSet添加项目时遇到困难.

输出是preCount = 3 postCount = 3.但是,我希望它是precount = 3 postCount = 4.非常感谢任何帮助.

static void Main(string[] args)
    {
        Debug.WriteLine("hello debug");

        List<string> stringList = new List<string>
        {
            "a", "b", "c"
        };

        DbSet<string> myDbSet = GetQueryableMockDbSet(stringList);
        int preCount = myDbSet.Count();
        myDbSet.Add("d");
        int postCount = myDbSet.Count();
        Debug.WriteLine("preCount = " + preCount + " postCount = " + postCount);
    }

    private static DbSet<T> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
    {
        var queryable = sourceList.AsQueryable();

        var dbSet = new Mock<DbSet<T>>();
        dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider); …
Run Code Online (Sandbox Code Playgroud)

c# linq moq dbset

45
推荐指数
1
解决办法
2万
查看次数

NSubstitute DbSet/IQueryable <T>

因此,EntityFramework 6比以前的版本更易于测试.对于像Moq这样的框架,互联网上有一些不错的例子,但情况是,我更喜欢使用NSubstitute.我已经将"非查询"示例翻译为使用NSubstitute,但我无法理解"查询测试".

Moq如何items.As<IQueryable<T>>().Setup(m => m.Provider).Returns(data.Provider);转化为NSubstitute?我觉得这样的事情((IQueryable<T>) items).Provider.Returns(data.Provider);却没有用.我也尝试过,items.AsQueryable().Provider.Returns(data.Provider);但也没用.

我得到的例外是:

"System.NotImplementedException:成员'IQueryable.Provider'尚未在类型'DbSet 1Proxy' which inherits from 'DbSet1' 上实现.'DbSet`1 '的测试双精度必须提供所使用的方法和属性的实现."

所以让我引用上面链接中的代码示例.此代码示例使用Moq来模拟DbContext和DbSet.

public void GetAllBlogs_orders_by_name()
{
  // Arrange
  var data = new List<Blog>
  {
     new Blog { Name = "BBB" },
     new Blog { Name = "ZZZ" },
     new Blog { Name = "AAA" },
  }.AsQueryable();

  var mockSet = new Mock<DbSet<Blog>>();
  mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
  mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
  mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
  mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

  var mockContext = new …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework nsubstitute dbcontext dbset

36
推荐指数
3
解决办法
1万
查看次数

与ID上的.SingleOrDefault相比,DbSet.Find方法非常慢

我有以下代码(数据库是SQL Server Compact 4.0):

Dim competitor=context.Competitors.Find(id)
Run Code Online (Sandbox Code Playgroud)

当我对此进行分析时,Find方法需要300 + ms才能从仅有60条记录的表中检索竞争对手.

当我将代码更改为:

Dim competitor=context.Competitors.SingleOrDefault(function(c) c.ID=id)
Run Code Online (Sandbox Code Playgroud)

然后在3毫秒内找到竞争对手.

竞争者类:

Public Class Competitor
    Implements IEquatable(Of Competitor)

    Public Sub New()
        CompetitionSubscriptions = New List(Of CompetitionSubscription)
        OpponentMeetings = New List(Of Meeting)
        GUID = GUID.NewGuid
    End Sub

    Public Sub New(name As String)
        Me.New()
        Me.Name = name
    End Sub

    'ID'
    Public Property ID As Long
    Public Property GUID As Guid

    'NATIVE PROPERTIES'
    Public Property Name As String

    'NAVIGATION PROPERTIES'
    Public Overridable Property CompetitionSubscriptions As ICollection(Of CompetitionSubscription)
    Public Overridable Property …
Run Code Online (Sandbox Code Playgroud)

entity-framework ef-code-first sql-server-ce-4 dbcontext dbset

34
推荐指数
1
解决办法
2万
查看次数

当我有一个实体时,动态地在DbContext中查找指定的通用DbSet

我有以下课程DbContext:

public class Order:BaseEntity
{
   public Number {get; set;}
}
Product:BaseEntity;
{
  public Name {get; set;} 
}

public class Context : DbContext
{
    ....
    public DbSet<Order> Orders { set; get; }
    public DbSet<Product> Products { set; get; }
    ....
}   
Run Code Online (Sandbox Code Playgroud)

我有一个想要添加到我的上下文的对象列表,但我不知道如何DbSet根据每个实体类型动态地找到合适的泛型.

IList<BaseEntity> list = new List<BaseEntity>();
Order o1 = new Order();
o1.Numner = "Ord1";
list.Add(o1);

Product p1 = new Product();
p1.Name = "Pencil";
list.Add(p1);

Context cntx = new Context();  
foreach (BaseEntity entity in list)
{
      cntx.Set<?>().Add(entity); …
Run Code Online (Sandbox Code Playgroud)

c# generics entity-framework code-first dbset

29
推荐指数
4
解决办法
3万
查看次数

使用实体框架dbset获取所有行

我想使用以下类型的语法从表中选择所有行

public IQueryable<Company> GetCompanies()
{
    return DbContext.Set<Company>()
    .// Select all
}
Run Code Online (Sandbox Code Playgroud)

请原谅我,因为我对EF完全不熟悉

c# entity-framework dbset

27
推荐指数
3
解决办法
8万
查看次数

在Entity Framework中动态创建DbSet <T>?

在LINQ to SQL中,我可以使用动态创建存储库DataContext.GetTable<T>.是否有类似的方法在Entity Framework 4中执行此操作,而不是声明特定的属性DbContext?例如:

public MyDbContext: DbContext
{
    public DbSet<MySet> MySets {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何MySets动态创建/获取动态参考,因为我可以使用LINQ to SQL,如下所示:

var mySet = MyDbContext.GetTable<MySet>();
Run Code Online (Sandbox Code Playgroud)

c# linq-to-sql entity-framework-4 ef-code-first dbset

23
推荐指数
2
解决办法
3万
查看次数

你能从DbSet获得DbContext吗?

在我的应用程序中,有时需要在一次操作中将10,000行或更多行保存到数据库中.我发现简单地迭代并一次添加一个项目可能需要花费半个多小时.

但是,如果我禁用AutoDetectChangesEnabled它需要约5秒(这正是我想要的)

我正在尝试向DbSet创建一个名为"AddRange"的扩展方法,该方法将禁用AutoDetectChangesEnabled,然后在完成时重新启用它.

public static void AddRange<TEntity>(this DbSet<TEntity> set, DbContext con, IEnumerable<TEntity> items) where TEntity : class
    {
        // Disable auto detect changes for speed
        var detectChanges = con.Configuration.AutoDetectChangesEnabled;
        try
        {
            con.Configuration.AutoDetectChangesEnabled = false;

            foreach (var item in items)
            {
                set.Add(item);
            }
        }
        finally
        {
            con.Configuration.AutoDetectChangesEnabled = detectChanges;
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:有没有办法从DbSet获取DbContext?我不喜欢把它作为参数 - 感觉它应该是不必要的.

c# entity-framework entity-framework-4.1 dbcontext dbset

22
推荐指数
3
解决办法
1万
查看次数

是DbSet <>.本地使用什么特别小心?

几天来,我一直在努力从存储库(DbContext)中检索我的实体.

我试图在原子动作中保存所有实体.因此,不同的实体一起代表了我的一些有价值的东西.如果所有实体都是"有效",那么我可以将它们全部保存到数据库中.实体"a"已存储在我的存储库中,需要检索以"验证"实体"b".

这就是问题出现的地方.我的存储库依赖于DbSet<TEntity>与Linq2Sql一起工作的类(Include()例如导航属性).但是,DbSet<TEntity>它不包含处于"已添加"状态的实体.

所以我(据我所知)有两个选择:

  • 使用ChangeTracker以查看哪些实体可用,并根据它们将它们查询到一个集合中EntityState.
  • 使用该DbSet<TEntity>.Local属性.

ChangeTracker似乎涉及一些额外的努力工作,以使我可以使用Linq2Sql Include()导航属性,例如

DbSet<TEntity>.Local似乎有点怪我.它可能只是名字.我只是读了一些表现不佳的东西(比DbSet <>本身慢).不确定这是否是虚假陈述.

具有重要EntityFramework经验的人能否对此有所启发?什么是"明智"的道路?或者我看到了幽灵,我应该总是使用这个.Local属性吗?

使用代码示例更新:


出了什么问题的一个例子

    public void AddAndRetrieveUncommittedTenant()
    {
        _tenantRepository = new TenantRepository(new TenantApplicationTestContext());

        const string tenantName = "testtenant";

        // Create the tenant, but not call `SaveChanges` yet until all entities are validated 
        _tenantRepository.Create(tenantName);

        //
        // Some other code
        //

        var tenant = _tenantRepository.GetTenants().FirstOrDefault(entity => entity.Name.Equals(tenantName));

        // The tenant will …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework dbcontext dbset

12
推荐指数
2
解决办法
1万
查看次数

实体框架dbset最有效的删除方式

我有以下内容,并寻找一种更有效的方法来删除vs循环记录,然后一次删除每一个(注意使用Dbset):

     var wcd = dbContext.ProgramDetails.Where(p => p.Id == Id);

     foreach (var wc in wcd.ToList())
     {
        dbContext.ProgramDetails.Remove(wc);
     }

     dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

还要说如果我们有1条记录如下:

    var pg = dbContext.Program.Where(p => p.Id == Id && Name == FName);
Run Code Online (Sandbox Code Playgroud)

删除这条记录的最佳方法是什么?

尝试了以下但是给出了一个错误:

    var pg = dbContext.Program.Where(p => p.Id == Id && Name == FName);
    dbContext.Program.Remove(wc);
Run Code Online (Sandbox Code Playgroud)

然后我使用foreach来删除一条记录,如上所示,这对于1条记录来说效率不高.

linq entity-framework dbset

10
推荐指数
1
解决办法
9661
查看次数

使用DbSet应用OrderBy

我正在尝试使用通用存储库实现分页和排序.如何在DbSet中按列的默认顺序获取主键列?

DbSet = Context.Set<T>();

public IQueryable<T> GetAll(int pageNumber = 0, int pageSize = 10, string sortColumn = "")
{
    return DbSet.OrderBy("how to use primary key column here").Skip(pageNumber * pageSize)Take(pageSize);
}
Run Code Online (Sandbox Code Playgroud)

c# repository-pattern dbset

8
推荐指数
1
解决办法
3504
查看次数