В качестве альтернативы использованию MARS (MultipleActiveResultSets) вы можете написать свой код, чтобы не открывать несколько наборов результатов.
Что вы можете сделать, это извлечь данные в память, таким образом у вас не будет открытого считывателя,Это часто вызывается повторением набора результатов при попытке открыть другой набор результатов.
Пример кода:
public class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
public class Blog
{
public int BlogID { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
public int PostID { get; set; }
public virtual Blog Blog { get; set; }
public string Text { get; set; }
}
Допустим, вы выполняете поиск в своембаза данных, содержащая их:
var context = new MyContext();
//here we have one resultset
var largeBlogs = context.Blogs.Where(b => b.Posts.Count > 5);
foreach (var blog in largeBlogs) //we use the result set here
{
//here we try to get another result set while we are still reading the above set.
var postsWithImportantText = blog.Posts.Where(p=>p.Text.Contains("Important Text"));
}
Мы можем сделать простое решение для этого, добавив .ToList () следующим образом:
var largeBlogs = context.Blogs.Where(b => b.Posts.Count > 5).ToList();
Это заставляет объектную рамку загружатьсясписок в память, поэтому, когда мы выполняем итерацию, хотя он в цикле foreach, он больше не использует средство чтения данных для открытия списка, а вместо этого находится в памяти.
Я понимаю, что это может быть нежелательно, если вынапример, хотите lazyload некоторых свойств.В основном это пример, который, мы надеемся, объясняет, как / почему вы можете решить эту проблему, чтобы вы могли принимать соответствующие решения