28

Lưu ý: Tôi đang sử dụng Entity Framework phiên bản 5hiệu quả Hầu hết các xử lý Tạo, Update, Delete với Entity Framework Mã Trước

Bên trong kho lưu trữ chung của tôi, tôi có Add, EditDelete phương pháp như sau :

public class EntityRepository<T> : IEntityRepository<T> 
    where T : class, IEntity, new() { 

    readonly DbContext _entitiesContext; 

    public EntityRepository(DbContext entitiesContext) { 

     if (entitiesContext == null) { 

      throw new ArgumentNullException("entitiesContext"); 
     } 

     _entitiesContext = entitiesContext; 
    } 

    //... 

    public virtual void Add(T entity) { 

     DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
     if (dbEntityEntry.State != EntityState.Detached) { 

      dbEntityEntry.State = EntityState.Added; 
     } 
     else { 

      _entitiesContext.Set<T>().Add(entity); 
     } 
    } 

    public virtual void Edit(T entity) { 

     DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
     if (dbEntityEntry.State == EntityState.Detached) { 

      _entitiesContext.Set<T>().Attach(entity); 
     } 

     dbEntityEntry.State = EntityState.Modified; 
    } 

    public virtual void Delete(T entity) { 

     DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
     if (dbEntityEntry.State != EntityState.Detached) { 

      dbEntityEntry.State = EntityState.Deleted; 
     } 
     else { 

      DbSet dbSet = _entitiesContext.Set<T>(); 
      dbSet.Attach(entity); 
      dbSet.Remove(entity); 
     } 
    } 
} 

Bạn có nghĩ rằng các phương pháp này được triển khai tốt không? Đặc biệt là phương pháp Add. Nó sẽ được tốt hơn để thực hiện các phương pháp Add như dưới đây?

public virtual void Add(T entity) { 

    DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity); 
    if (dbEntityEntry.State == EntityState.Detached) { 

     _entitiesContext.Set<T>().Attach(entity); 
    } 

    dbEntityEntry.State = EntityState.Added; 
} 
+0

là điều này sử dụng Mã đầu tiên? – PositiveGuy

+1

@CoffeeAddict Đó là EF 5.0.0. DB đầu tiên hoặc Mã đầu tiên, nó không quan trọng ở đây tôi đoán vì nó là một mã kho chung. – tugberk

+0

Bạn có thể sử dụng thư viện mới được phát hành sẽ tự động đặt trạng thái của tất cả các thực thể trong biểu đồ tổ chức ***. Bạn có thể đọc [câu trả lời của tôi cho câu hỏi tương tự] (http://stackoverflow.com/questions/5557829/update-row-if-it-exists-else-insert-logic-with-entity-framework/39609020#39609020) . –

Trả lời

37

Đối với thêm:

public bool Add<E>(E entity) where E : class 
     { 
      DataContext.Entry(entity).State = System.Data.EntityState.Added; 
      Save(); 
     } 

Đối update:

public bool Update<E>(E entity) where E : class 
     { 
      DataContext.Entry(entity).State = System.Data.EntityState.Modified; 
      Save(); 
     } 

Đối với xóa:

public bool Delete<E>(E entity) where E : class 
     { 
      DataContext.Entry(entity).State = System.Data.EntityState.Deleted; 
      Save(); 
     } 

Và một Save() phương pháp tin trả về đúng hay sai vì vậy bạn có thể dễ dàng dự phòng trong bộ điều khiển phụ thuộc vào kết quả

private bool Save() 
     { 
      return DataContext.SaveChanges() > 0;     
     } 

này chỉ là một phần của kho lưu trữ chung của tôi. Nó hoạt động tốt trong các ứng dụng doanh nghiệp.

UPDATE:

Gỡ chỉ ảnh hưởng đến đối tượng cụ thể được truyền cho phương pháp này. Nếu đối tượng bị tách rời có các đối tượng liên quan trong ngữ cảnh đối tượng, thì các đối tượng sẽ không bị tách rời.

EF sẽ tự động đính kèm các đối tượng tách ra trong biểu đồ khi đặt trạng thái của một thực thể hoặc khi gọi SaveChanges().

Tôi thực sự không biết tại sao bạn cần tách các đối tượng ra khỏi ngữ cảnh. Bạn cũng có thể sử dụng AsNoTracking() để tải các thực thể từ cơ sở dữ liệu mà không cần đính kèm chúng vào ngữ cảnh ngay từ đầu.

+0

Điều gì sẽ xảy ra nếu đối tượng bạn đang chuyển sang phương thức 'Thêm' hoặc' Chỉnh sửa' ở trạng thái 'Tách biệt'? – tugberk

+0

Nhìn vào cập nhật trong câu trả lời của tôi. –

+0

Cảm ơn câu trả lời. – tugberk