The following code works
[Route("case-studies/{slug}")]
public async Task<ActionResult> Details(string slug)
{
var item = await Db.Pages.OfType<CaseStudy>()
.WithSlug(slug)
.FirstOrDefaultAsync();
if (item == null)
{
return HttpNotFound();
}
var related = await Db.Pages.OfType<CaseStudy>()
.Where(r => r.Client == item.Client && r.Id != item.Id)
.Where(r => !r.IsArchived)
.Include(r => r.Media)
.Take(3)
.Project()
.To<RelatedPageModel>()
.ToListAsync();
var archived = await Db.Pages.OfType<CaseStudy>()
.Where(r => r.Client == item.Client && r.Id != item.Id)
.Where(r => r.IsArchived)
.Take(3)
.Project()
.To<RelatedPageModel>()
.ToListAsync();
ViewData.Model = new DetailPageModel<CaseStudy>()
{
Item = item,
RelatedItems = related,
ArchivedItems = archived
};
return View();
}
However when I try to refactor the async method calls as follows
[Route("case-studies/{slug}")]
public async Task<ActionResult> Details(string slug)
{
var item = await Db.Pages.OfType<CaseStudy>()
.WithSlug(slug)
.FirstOrDefaultAsync();
if (item == null)
{
return HttpNotFound();
}
var related = await GetRelatedCaseStudies(item, false);
var archived = await GetRelatedCaseStudies(item, true);
ViewData.Model = new DetailPageModel<CaseStudy>()
{
Item = item,
RelatedItems = related,
ArchivedItems = archived
};
return View();
}
private Task<List<RelatedPageModel>> GetRelatedCaseStudies(CaseStudy casestudy, bool archived)
{
return Db.Pages.OfType<CaseStudy>()
.Where(r => r.Client == casestudy.Client && r.Id != casestudy.Id)
.Where(x => x.IsArchived == archived)
.Include(r => r.Media)
.Take(3)
.Project().To<RelatedPageModel>()
.ToListAsync();
}
It fails giving me the following error
A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe.
Why is this? How can I make this work?
Update:
Db is declared in the base controller as follows
private WebSiteDb db;
protected WebSiteDb Db
{
get
{
LazyInitializer.EnsureInitialized(ref db, () => new WebSiteDb());
return db;
}
}
WebSiteDb extends DbContext as follows
[DbConfigurationType(typeof(DbConfig))]
public class WebSiteDb : DbContext
{
static WebSiteDb() {
Database.SetInitializer<WebSiteDb>(new WebSiteDbInitializer());
}
public IDbSet<Page> Pages { get; set; }
public IDbSet<Media> Media { get; set; }
...some missing sets
public WebSiteDb() : base("MyDatabaseName") { }
}
If I await inside the method the error is thrown from inside the method instead
WithSlug() is as follows
public static IQueryable<T> WithSlug<T>(this IQueryable<T> pages, string slug) where T : Page
{
return pages.Where(p => p.Slug == slug);
}
> GetRelatedCaseStudies(CaseStudy casestudy, bool archived) {
– Solmead Feb 26 '15 at 20:09