Le code que j'ai obtenu jusqu'à présent fonctionne bien
public async Task<ActionResult> Details(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
ItemDetailModel model = new ItemDetailModel();
model.Item = await db.Items.FindAsync(id);
if (model.Item == null)
{
return HttpNotFound();
}
return View(model);
}
Mais je veux inclure 1 table de plus et je ne peux pas utiliser FindAsync
public async Task<ActionResult> Details(Guid? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
ItemDetailModel model = new ItemDetailModel();
model.Item = await db.Items.Include(i=>i.ItemVerifications).FindAsync(id);
if (model.Item == null)
{
return HttpNotFound();
}
return View(model);
}
Je suis donc confronté à cette erreur
Code de gravité Description Erreur d'état de suppression de ligne de fichier de projet CS1061 'IQueryable' ne contient pas de définition pour 'FindAsync' et aucune méthode d'extension 'FindAsync' acceptant un premier argument de type 'IQueryable' n'a pu être trouvée (manque-t-il une directive ou un Référence d'assemblage?)
Une idée de comment y remédier?
Le plus simple est d'utiliser à la place FirstOrDefaultAsync
ou SingleOrDefaultAsync
:
model.Item = await db.Items.Include(i => i.ItemVerifications)
.FirstOrDefaultAsync(i => i.Id == id.Value);
La raison pour laquelle vous obtenez l'erreur est que les méthodes Find
/FindAsync
sont définies pour DbSet<T>
, mais le résultat de Include
est IQueryable<T>
.
Une autre façon est de combiner FindAsync
avec chargement explicite :
model.Item = await db.Items.FindAsync(id);
if (model.Item == null)
{
return HttpNotFound();
}
await db.Entry(model.Item).Collection(i => i.ItemVerifications).LoadAsync();
Si vous utilisez un référentiel générique et que vous ne connaissez pas le PK au moment de l'exécution, cette approche peut vous aider:
public interface IGenericRepository<TEntity> where TEntity : class
{
Task<TEntity> Get(int id, string[] paths = null);
}
public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
{
private readonly ApplicationDbContext _context;
private readonly DbSet<TEntity> _dbSet;
public GenericRepository(ApplicationDbContext context)
{
_context = context;
_dbSet = _context.Set<TEntity>();
}
public async Task<TEntity> Get(int id, string[] paths = null)
{
var model = await _dbSet.FindAsync(id);
foreach (var path in paths)
{
_context.Entry(model).Reference(path).Load();
}
return model;
}
}