如何在此上下文中实现IDisposable?

时间:2011-02-13 15:54:38

标签: c# entity-framework-4 idisposable

我正在使用Entity Framework 4和MSSQL在我的Windows窗体应用程序上存储和访问数据。

以下是我用来访问数据的示例类:

public class StudentRepository : IDisposable
{
    ColegioDBEntities db = new ColegioDBEntities();

    public IQueryable<Student> FindAllStudents()
    {
        return db.Students;
    }

    public Student FindStudent(int id)
    {
        return db.Students.SingleOrDefault(c => c.StudentId == id);
    }

    public void Add(Student Student)
    {
        db.AddToStudents(Student);
    }

    public void Save()
    {
        db.SaveChanges();
    }

    public void Dispose()
    {
        db.Dispose();
    }
}

以下是我如何使用它的一个例子。

    private void btnLogin_Click(object sender, EventArgs e)
    {
        UserRepository repo = new UserRepository();
        var result = repo.FindAllUsers().Where(u => u.Username == txtUsername.Text && u.Password == txtPassword.Text);
        if (result.Count() > 0)
        {
            MainForm form = new MainForm(txtUsername.Text);
            form.Show();
            this.Hide();
        }
        else
        {
            MessageBox.Show("Usuario y/o contraseña incorrecta.",
            "Acceso Denegado",
            MessageBoxButtons.OK,
            MessageBoxIcon.Stop,
            MessageBoxDefaultButton.Button1);
            txtUsername.Focus();
            txtPassword.Focus();
        }
    }

有人建议我使用IDisposable来正确“清理”连接,但我不知道如何实现这一点。

有什么建议吗?谢谢你的时间。

2 个答案:

答案 0 :(得分:3)

不确定我是否真的明白了,但您似乎实施了IDisposable,但您需要致电Dispose或使用using

  using(UserRepository repo = new UserRepository())
  {
    // ...
  }

在离开using块时调用Dispose并清理UserRepository。

还有更多信息:

答案 1 :(得分:1)

StudentRepository还是UserRepository?如果一个人从另一个派生出来那么你就有问题了。

如果没有继承,您可以接受StudentRepository的实现。为了完全正确,你应该通过声明密封来确保:

public sealed  class StudentRepository : IDisposable
{
    ....
    public void Dispose()
    {
        db.Dispose();
    }
}

而且,正如@Stefan已经指出的那样,每次使用using() { }实例化StudentRepository时都必须使用它。