2012-03-22 50 views
16

tôi đang làm việc trên dự án MVC, với mô hình kho và khuôn khổ tổ chức nào, bây giờ hình thức của tôi, tôi có một mô hình mẫuEntityFramework cập nhật một phần mô hình

SampleModel
1) Tên
2) tuổi
3 địa chỉ)
4) lưu ý
5) ngày cập nhật

tôi đang hiển thị dữ liệu chỉ sau trên biểu mẫu chỉnh sửa
1) tên
2)
tuổi 3) giải quyết

bây giờ nếu tôi cập nhật các mô hình với giá trị tài sản bị mất bằng cách sử dụng kho lưu trữ, các ghi chú, lĩnh vực dateupdated đi null.

Câu hỏi của tôi là làm thế nào để tôi cập nhật chỉ vài thuộc tính được chọn bằng cách sử dụng kho lưu trữ (tryupdatemodel không có sẵn trong kho lưu trữ) và tôi không muốn gọi đối tượng gốc và ánh xạ thích hợp với mô hình cập nhật.

Có cách nào không, phải có.

Trả lời

21

Bạn có thể cập nhật chỉ tập hợp con của các lĩnh vực:

using (var context = new YourDbContext()) 
{ 
    context.SamepleModels.Attach(sampleModel); 

    DbEntityEntry<SameplModel> entry = context.Entry(sampleModel); 
    entry.Property(e => e.Name).IsModified = true; 
    entry.Property(e => e.Age).IsModified = true; 
    entry.Property(e => e.Address).IsModified = true; 

    context.SaveChanges(); 
} 

hoặc trong ObjectContext API:

using (var context = new YourObjectContext()) 
{ 
    context.SamepleModels.Attach(sampleModel); 

    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(sampleModel); 
    entry.SetModifiedProperty("Name"); 
    entry.SetModifiedProperty("Age"); 
    entry.SetModifiedProperty("Address"); 

    context.SaveChanges(); 
} 
+0

ohh ok hoặc viết truy vấn sql để cập nhật, phải không? hoặc viết một trình trợ giúp chung để đánh dấu các thuộc tính đã chỉnh sửa, humm ... đó là những gì TryUpdate phải làm. – Milan

+0

Mục nhập() không tồn tại trong EF 4.0. – Suncat2000

+1

@ Suncat2000: Ví dụ thứ hai dành cho EF 4.0, phiên bản đầu tiên dành cho EF 4.1 trở lên. –

1

Đây là một chủ đề cũ, nhưng nếu có ai quan tâm, để mở rộng vào các giải pháp Ladislav, chúng tôi đã đưa ra phương pháp mở rộng hữu ích cho EF 4.1 trở lên:

public static void SetModified<TEntity>(
     this DbEntityEntry<TEntity> entry, 
     IEnumerable<Expression<Func<TEntity, object>>> expressions) where TEntity : class, IEntity 
    { 
     foreach (var expression in expressions) 
      entry.Property(expression).IsModified = true; 
    } 

Rõ ràng là y bạn sẽ cần lấy đi ràng buộc IEntity trừ khi bạn đang sử dụng một giao diện bằng cùng tên cho các POCO của bạn.

sử dụng Ví dụ sẽ là:

 var user = new User 
     { 
      Id = Request.Id, 
      UserName = Request.UserName, 
      FirstName = Request.FirstName 
     }; 

     var expressions = new List<Expression<Func<User, object>>> 
       { 
        x => x.UserName, 
        x => x.FirstName 
       }; 

     context.Entry(user).SetModified(expressions); 
Các vấn đề liên quan