我正在使用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来正确“清理”连接,但我不知道如何实现这一点。
有什么建议吗?谢谢你的时间。
答案 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时都必须使用它。