2011-02-13 13 views
5

Windows Forms uygulamasında verileri depolamak ve bunlara erişmek için MSSQL ile birlikte Entity Framework 4 kullanıyorum. İşte Bu bağlamda nerelere aykırı davranabilirim?

Ben verilere erişme kullanmak bir örnek sınıftır:

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

Ve burada kullanmak nasıl bir örnek.

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

Birisi düzgün bağlantı "temizlemek" için IDisposable kullanmak önerdi, ama ben bu uygulamaya nasıl bilmiyorum.

Herhangi bir öneriniz var mı? Zaman ayırdığın için teşekkürler.

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

Bu kullanarak bloğu ayrılırken atarken çağırır ve UserRepository temizler: Gerçekten nokta var, ancak IDisposable uygulamak gibi görünüyor, ancak usingDispose arayabilir veya kullanmanız gerekiyorsa

cevap

3

emin değil . o StudentRepository veya UserRepository

+0

Ah! Önemli olan buydu. :) Kullanılan ifadeyi eklemeyi unuttum, böylece nesne imha edildi. Zaman ayırdığın için teşekkürler. Bir Havuz dersi kullandığımda her zaman bunu önerir misiniz? –

+0

IDisposable türleri ile uğraşırken HER ZAMAN bunu yapmalısınız. Yapmazsanız bellek sızıntıları ve muhtemelen kötü yan etkiler alırsınız. –

+0

Evet, tabi ki, sınıfın her örneği, kullanıldıktan sonra imha edilmelidir. – Enyra

1

mi:

biraz daha bilgi bulunmaktadır? Ve eğer biri diğerinden gelirse, o zaman bir sorunun vardır.

Kalıtım olmadan StudentRepository uygulamanız kabul edilebilir. ilan ederek emin olmak gerekir tamamen doğru olmak mühürlü: @Stefan zaten belirttiği gibi

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

Ve, bunu kullanacağım sen using() { } ile, bir StudentRepository örneğini her zaman yapmak zorunda.

İlgili konular