C# 数据库上下文处理?

C# 数据库上下文处理?,c#,asp.net-mvc,entity-framework,idisposable,C#,Asp.net Mvc,Entity Framework,Idisposable,DbContext public class HaberPortalDB : DbContext { public DbSet<Haberler> Haberler { get; set; } public DbSet<Kategoriler> Kategoriler { get; set; } public DbSet<Yazarlar> Yazarlar { get; set; } } public class Haberler

DbContext

public class HaberPortalDB : DbContext
{
    public DbSet<Haberler> Haberler { get; set; }
    public DbSet<Kategoriler> Kategoriler { get; set; }
    public DbSet<Yazarlar> Yazarlar { get; set; }
}

public class Haberler
{
    public virtual int Id { get; set; }
    public virtual string Baslik { get; set; }
    public virtual string Aciklama { get; set; }
    public virtual string Icerik { get; set; }

    public virtual int YazarId { get; set; }
    public virtual Yazarlar Yazar { get; set; }

    public virtual int KategoriId { get; set; }
    public virtual Kategoriler Kategori { get; set; }
    public virtual ICollection<Resimler> Resimler { get; set; }
}

public class Kategoriler
{
    public virtual int Id { get; set; }
    public virtual string KategoriAdi { get; set; }
    public virtual string Aciklama { get; set; }

    public virtual ICollection<Haberler> Haberler { get; set; }
}

public class Yazarlar
{
    public virtual int Id { get; set; }
    public virtual string YazarAdi { get; set; }
    public virtual string Ozgecmis { get; set; }
    public virtual string Eposta { get; set; }

    public virtual ICollection<Haberler> Haberler { get; set; }
}

public class Resimler
{
    public virtual int Id { get; set; }
    public virtual string Url { get; set; }
    public virtual string Ad { get; set; }

    public virtual Haberler Haber { get; set; }
}
每种方法都有断点
Dispose()
方法在使用其他方法之后工作

如何为每个工作的方法激发
Dispose()
方法?

需要注意的几点:

  • 控制器的生命周期仅与每个请求一样长
  • 每个请求将执行一个操作方法
  • 当控制器完成请求时调用Dispose
因此,这是每个请求期间发生的情况:

  • 控制器已初始化
  • DbContext已初始化
  • 动作方法执行
  • 执行控制器处置方法

  • Dispose()
    方法在使用其他方法之后工作。你这是什么意思?看看这个问题@jackncoke,对不起我的英语。我是说dispose方法是如何调用的?我本来打算尝试修复它,但不想把它搞砸。希望你能找到解决办法@jackncoke事实上jrummell的答案是我期待的。但在他的建议之后,现在我又遇到了另一个问题:)谢谢…+1。我明白了,“每次请求后都会调用controller dispose”。但是怎么做呢?射击方法在哪里?我们可以为此使用语句
    ,但控制器如何调用dispose方法?@AliRızaAdıyahşi MVC框架调用控制器的dispose方法。@四十二如果您想立即进行处置,这是必要的。另一种选择是使用DI框架来控制您的生存期,例如。那么,为什么我们要在控制器类中为DbContextClass使用
    using语句
    ?我的意思是有很多关于
    using语句的代码示例、教程和文章。您可以将DbContext的每个用法包装在using语句中,但由于每个请求只执行一个操作方法,因此在您的问题中编写代码的方式将几乎具有相同的生存期。基本上,它是相同的解决方案,具有不同的实现。
    
        //
        // GET: /Test/
    
        public ActionResult Index()
        {
            return View(db.Kategoriler.ToList());
        }
    
        //
        // GET: /Test/Details/5
    
        public ActionResult Details(int id = 0)
        {
            Kategoriler kategoriler = db.Kategoriler.Find(id);
            if (kategoriler == null)
            {
                return HttpNotFound();
            }
            return View(kategoriler);
        }
    
        //
        // GET: /Test/Create
    
        public ActionResult Create()
        {
            return View();
        }
    
        //
        // POST: /Test/Create
    
        [HttpPost]
        public ActionResult Create(Kategoriler kategoriler)
        {
            if (ModelState.IsValid)
            {
                db.Kategoriler.Add(kategoriler);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
    
            return View(kategoriler);
        }
    
        //
        // GET: /Test/Edit/5
    
        public ActionResult Edit(int id = 0)
        {
            Kategoriler kategoriler = db.Kategoriler.Find(id);
            if (kategoriler == null)
            {
                return HttpNotFound();
            }
            return View(kategoriler);
        }
    
        //
        // POST: /Test/Edit/5
    
        [HttpPost]
        public ActionResult Edit(Kategoriler kategoriler)
        {
            if (ModelState.IsValid)
            {
                db.Entry(kategoriler).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(kategoriler);
        }
    
        //
        // GET: /Test/Delete/5
    
        public ActionResult Delete(int id = 0)
        {
            Kategoriler kategoriler = db.Kategoriler.Find(id);
            if (kategoriler == null)
            {
                return HttpNotFound();
            }
            return View(kategoriler);
        }
    
        //
        // POST: /Test/Delete/5
    
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            Kategoriler kategoriler = db.Kategoriler.Find(id);
            db.Kategoriler.Remove(kategoriler);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    
        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }