DbContext如何释放资源?

7

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; }
}

脚手架正在生成以下操作方法。
    //
    // 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);
    }

每个方法都有断点。在其他方法工作后,Dispose() 方法开始工作。
如何使每个方法工作后都能触发 Dispose() 方法?

Dispose() 方法是在其他方法执行完毕后才起作用的。这是什么意思? - jackncoke
1
请看这个问题:https://dev59.com/8XM_5IYBdhLWcg3wcCnc - polybios
@jackncoke,抱歉我的英语不好。我的意思是如何调用dispose方法? - AliRıza Adıyahşi
我本来想试着修复它,但不想把事情搞砸。希望你能找到解决方案! - jackncoke
@jackncoke,事实上jrummell的回答是我期望的。但是在他的建议之后,我现在又遇到了另一个问题:)谢谢... - AliRıza Adıyahşi
1个回答

8

需要注意以下几点:

  • 你的控制器的生命周期只有每个请求的时间。
  • 每个请求将执行一个操作方法。
  • 当控制器完成请求时,Dispose方法会被调用。

所以,在每个请求期间会发生以下事情:

  1. 控制器初始化
  2. DbContext初始化
  3. 执行操作方法
  4. 控制器的Dispose方法执行

我明白了,“控制器释放在每个请求之后被调用”。但是怎么实现的呢?触发方法在哪里?我们可以使用“using语句”来实现,但是控制器如何调用释放方法呢? - AliRıza Adıyahşi
MVC框架调用控制器的dispose方法。 - jrummell
那么,为什么我们在控制器类中使用 using-statement 来处理 DbContextClass?我的意思是,有很多代码示例、教程和文章都使用了 using-statement - AliRıza Adıyahşi
你可以在每个 DbContext 的使用中包装一个 using 语句,但由于每个请求只执行一个操作方法,所以你问题中的代码编写方式几乎具有相同的生命周期。基本上,这是一种不同实现的相同解决方案。 - jrummell
不是很理解,但感谢回复。我想我应该理解“几乎相同”。 - AliRıza Adıyahşi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接