2013-12-08 16 views
49

Tôi đã đọc qua LOTS bài đăng về cách lưu một thực thể tách rời trong Khuôn khổ thực thể. Tất cả chúng dường như áp dụng cho các phiên bản cũ hơn của Entity Framework. Chúng tham chiếu các phương thức như ApplyCurrentValues ​​và ChangeObjectState mà dường như không tồn tại. Trên một ý thích bất chợt tôi quyết định thử một phương pháp tôi tìm thấy qua IntelliSense và tôi muốn chắc chắn đây là cách chính xác để làm điều này vì tôi không nhận được để xem những gì đang xảy ra đằng sau hậu trường:Lưu thực thể tách rời trong Entity Framework 6

public void SaveOrder(Order order) 
{ 
    using (VirtualWebEntities db = new VirtualWebEntities()) 
    { 
     db.Orders.Attach(order); 
     db.Entry(order).State = System.Data.Entity.EntityState.Modified; 
     db.SaveChanges(); 
    } 
} 

Is đây là cách chính xác để cập nhật một mục hiện có đã được thay đổi?

Trả lời

80

Có, điều này là chính xác. This article describes various ways of adding and attaching entities, và nó cung cấp ví dụ này:

var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" }; 
using (var context = new BloggingContext()) 
{ 
    // The next step implicitly attaches the entity 
    context.Entry(existingBlog).State = EntityState.Modified; 
    // Do some more work... 
    context.SaveChanges(); 
} 

Kể từ EF không biết được tính chất khác với những người trong cơ sở dữ liệu, nó sẽ cập nhật tất cả:

Khi bạn thay đổi trạng thái để thay đổi tất cả các thuộc tính của thực thể sẽ được đánh dấu là đã sửa đổi và tất cả các giá trị thuộc tính sẽ được gửi đến cơ sở dữ liệu khi SaveChanges được gọi.

Để tránh điều này, bạn có thể set which properties are modified bằng tay chứ không phải là thiết lập toàn bộ tiểu bang tổ chức:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 
    context.Entry(blog).Property(u => u.Name).IsModified = true;  
    // Use a string for the property name 
    context.Entry(blog).Property("Name").IsModified = true; 
} 
+0

nhờ. vì vậy tôi chỉ muốn làm rõ .. không còn là một khái niệm về applycurrentvalues ​​như trong các phiên bản trước đây, nơi bạn có thể thông báo cho EF trường nào đã thay đổi? – KingOfHypocrites

+1

@KingOfHypocrites Bạn có thể, tôi đã chỉnh sửa câu trả lời của mình. Tôi đề nghị xem xét [tài liệu EF6] (http://msdn.microsoft.com/en-us/data/ee712907), nó có rất nhiều ví dụ và giải thích tốt, và được viết theo một cách rất đơn giản. –

+0

Cảm ơn bạn đã liên kết. Điều duy nhất với ví dụ của bạn là tôi sẽ phải đánh dấu thủ công từng thuộc tính. Phiên bản cũ có phương pháp áp dụng giá trị ở đây bạn có thể lấy đối tượng mới và áp dụng cho đối tượng cũ. Điều này sẽ tự động đánh dấu bất kỳ thuộc tính đã thay đổi nào để nó sẽ biết những gì cần cập nhật khi lưu. Tôi vẫn đang tìm kiếm một tương đương. – KingOfHypocrites

Các vấn đề liên quan