私が今までに持っているコードは正常に動作します
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);
}
しかし、さらに1つのテーブルを含めたいので、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);
}
だから私はこのエラーに直面しています
重大度コード説明プロジェクトファイル行抑制状態エラーCS1061「IQueryable」には「FindAsync」の定義が含まれておらず、タイプ「IQueryable」の最初の引数を受け入れる拡張メソッド「FindAsync」が見つかりません(usingディレクティブまたはアセンブリ参照?)
それを修正する手がかりはありますか?
最も簡単なのは、代わりにFirstOrDefaultAsync
またはSingleOrDefaultAsync
を使用することです:
model.Item = await db.Items.Include(i => i.ItemVerifications)
.FirstOrDefaultAsync(i => i.Id == id.Value);
エラーが発生する理由は、Find
/FindAsync
メソッドがDbSet<T>
、ただしInclude
の結果はIQueryable<T>
。
別の方法は、FindAsync
を 明示的な読み込み と組み合わせることです。
model.Item = await db.Items.FindAsync(id);
if (model.Item == null)
{
return HttpNotFound();
}
await db.Entry(model.Item).Collection(i => i.ItemVerifications).LoadAsync();
汎用リポジトリを使用していて、実行時のPKがわからない場合、このアプローチは役立ちます。
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;
}
}