2013-03-14 15 views
8

this makalesini okudum ve hala önemli anları anlamaya çalışıyorum. Her Silme/Güncelleme/... işlemindeVarlık çerçevesinde kaydetme

'a ihtiyacımız yok mu?

Herhangi bir varlığın özelliğini değiştirirseniz, SaveChanges() veritabanına sonuç gönderir veya EntityState.Modifyed el ile ayarlamalı mıyım?

public class Repository<T> : IRepository<T> 
    where T : class 
{ 
    private IDbContext _context; 

    public Repository(IDbContext context) 
    { 
     _context = context; 
    } 

    private IDbSet<T> DbSet 
    { 
     get 
     { 
      return _context.Set<T>(); 
     } 
    } 

    #region IRepository<T> Members 

    public void Insert(T entity) 
    { 
     DbSet.Add(entity); 
    } 

    public void Delete(T entity) 
    { 
     DbSet.Remove(entity); 
    } 

    public IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate) 
    { 
     return DbSet.Where(predicate); 
    } 

    public IQueryable<T> GetAll() 
    { 
     return DbSet; 
    } 

    public T GetById(int id) 
    { 
     return DbSet.Find(id); 
    } 
    #endregion 
} 

public interface IDbContext 
{ 
    IDbSet<T> Set<T>() where T : class; 

    int SaveChanges(); 
    void Dispose(); 
} 
+1

Her zaman "[... = EntityState.Modifyed]" demek zorunda değilsiniz. – MarcinJuraszek

cevap

4

Sen sor:

biz/Güncelleme Sil her _context.SaveChanges() çağrı gerekmez mı/... operasyonlar?

Hayır yapmayız. Delete numaralı telefonu arayarak varlıkları silmiyoruz - işareti silinmek üzere.

Update ile aynı şey, ancak varlığı istediğiniz değişiklikleri yapan başka bir işlem yapmanız gerekmez. Tüm özellikler (varsayılan şablon tarafından oluşturulur), bir öğenin ne zaman değiştirileceğini bilmesi için INotifyPropertyChanged uygular.

Tüm varlıklar (önce veritabanında - defullt şablonu tarafından otomatik olarak oluşturulur) State özelliğine sahiptir. Bu özellik, nesneler ObjectEntity'nin kapsamında gerçekleştiği sürece ObjectContext tarafından korunur.

örn.

Customer c; 
using(var context = new MyEntityContext()) 
{ 
    c = context.Customer.FirstOrDefault(); //state is now Unchanged 
    c.Name = "new name"; // this set the State to Modified 
//context.SaveChanges(); // will persist the data to the store, and set the State back to unchaged 
} 

//if we look at our customer outside the scope of our context 
//it's State will be Detacth 
Console.WriteLine(c.State); 

Sonra bir varlık varsa onların değişiklikler yerel bir işlem

DÜZENLEME

yılında veritabanına için kalıcı olacak AddedDeleted veya Modified bir devlete sahip tüm entites SaveChanges çağrı silme için işaretlenmiş ve bunu değiştirmeye çalışın - bir InvalidOperationException

+0

yüzden arama Repository.GetAll() .Değişiklikleri göndermek için SaveChanges(). Hala silinen öğeleri (silinmiş olarak işaretlenmiş) sorgulayabilirsiniz? – NET

+1

evet 'Savechanges''ı arayabilmeniz gerekir. Kesinlikle.Ben hala tavsiye etmemekle birlikte silinmek üzere işaretlenmiş bir öğeyi sorgulayabileceğinizi düşünüyorum - bir varlığın "Silindi" - "Değiştirildi" - –

+1

cevabını değiştirdiğimi düşünmüyorum. Silme için işaretlenmiş bir öğeyi değiştirmeye çalışırsanız, bir istisna alırsınız. –

2

Sen in-bellek bağlamında birçok değişiklik yapabilir, Ekleme, güncelleme gibi ve siler:

İşte benim kodudur. SaveCahnges() öğesini çağırdıktan sonra yaptığınız tüm değişiklikler, DB'de tek bir işlemle kaydedilecektir. Bu, eiteher'in gönderildikleri veya bir hata durumunda bunların hiçbirinin hiçbiri olmadığı anlamına gelir.

+0

Bu yüzden İdame Edici'de SaveChanges yöntemini kullanmalı mıyım? – NET

+0

İçeriği neden deponuzla sarmak isteyeceğinizden emin değilim. bağlam ile doğrudan çalışabilirsiniz. Örneğin. context.Cars.AddObject (yeni Araba()), vb ... –