DbContext的Attach方法报错:不存在该定义,如何解决?
解决DbContext没有Attach方法的问题
原因分析
出现DbContext does not contain a definition of Attach错误,通常是以下两种情况:
- 自定义的
ApplicationDbContext没有正确继承官方的DbContext基类 - 使用的EF版本不支持直接在DbContext实例上调用Attach方法
解决方案
1. 检查DbContext继承关系
确保你的ApplicationDbContext正确继承对应EF版本的DbContext类:
- EF6及更早版本:
using System.Data.Entity; public class ApplicationDbContext : DbContext { public DbSet<Brand> Brands { get; set; } // 其他实体集定义... }
- EF Core版本:
using Microsoft.EntityFrameworkCore; public class ApplicationDbContext : DbContext { public DbSet<Brand> Brands { get; set; } // 其他实体集定义... }
2. 通过实体集调用Attach方法
如果直接调用_context.Attach无效,改用对应实体的DbSet来执行Attach操作:
修改Post请求的Delete方法:
[HttpPost] public ActionResult Delete(Brand brand) { _context.Brands.Attach(brand); _context.Entry(brand).State = EntityState.Deleted; _context.SaveChanges(); return RedirectToAction("Index"); }
3. 跳过Attach直接设置实体状态
对于删除操作,无需显式调用Attach,直接设置实体状态即可,EF会自动处理跟踪:
[HttpPost] public ActionResult Delete(Brand brand) { _context.Entry(brand).State = EntityState.Deleted; _context.SaveChanges(); return RedirectToAction("Index"); }
额外优化:避免直接实例化DbContext
控制器中直接new ApplicationDbContext可能导致资源泄漏,建议使用依赖注入获取实例:
public class ApplicationController : Controller { private readonly ApplicationDbContext _context; public ApplicationController(ApplicationDbContext context) { _context = context; } // 原有方法... }
内容的提问来源于stack exchange,提问作者quanhprx
相关产品推荐
相关产品推荐

