2012-04-30 26 views
27

Với đoạn mã sau, như thế nào EF/DbContext biết về sự thay đổi thực hiện cho các khách hàng đối tượng:Làm thế nào thay đổi theo dõi công trình trong Entity Framework

class Program 
{ 
    static void Main() 
    { 
     using(var shopContext = new ShopContext()) 
     { 
      var customer = shopContext.Customers.Find(7); 

      customer.City = "Marion"; 

      customer.State = "Indiana"; 

      shopContext.SaveChanges(); 
     } 
    } 
} 

public class ShopContext : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 
} 

public class Customer 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

Cảm ơn bạn

+3

Đối với những người mới tham gia, bài đăng trên blog này có thể hữu ích: http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/ – Karsten

Trả lời

45

Khi bạn tải các thực thể từ ngữ cảnh nó giữ một cấu trúc dữ liệu bổ sung - hãy gọi nó là mục nhập. Mục nhập chứa hai bộ giá trị - giá trị gốc và giá trị hiện tại. Khi bạn thực hiện thao tác SaveChanges EF đi qua các thực thể khách hàng của bạn và cập nhật các giá trị hiện tại trong mục nhập để chúng khớp với trạng thái thực của thực thể của bạn - hoạt động này được gọi là phát hiện các thay đổi. Trong khi tạo lệnh SQL, EF sẽ so sánh các giá trị hiện tại và bản gốc và xây dựng một câu lệnh cập nhật SQL để sửa đổi các giá trị đã thay đổi trong cơ sở dữ liệu. Thao tác này được gọi là theo dõi thay đổi ảnh chụp nhanh - EF giữ ảnh chụp nhanh trong mục nhập.

Có một thay thế được gọi là theo dõi thay đổi động sẽ sửa đổi giá trị hiện tại trong mục nhập cùng lúc bạn gán giá trị cho thuộc tính của đối tượng của bạn. Theo dõi thay đổi động có các yêu cầu cụ thể (như tất cả các thuộc tính của bạn trong thực thể phải là virtual) bởi vì nó phải bao bọc lớp của bạn thành một proxy động khi chạy. Đây được sử dụng là cách ưa thích nhưng do một số vấn đề hiệu suất trong các tình huống phức tạp, theo dõi thay đổi chụp nhanh hiện được cho là được sử dụng làm mặc định.

+0

hi , bối cảnh biết về đối tượng khách hàng như thế nào? Nó được kết nối/liên kết như thế nào? –

+0

Bối cảnh biết về nó bởi vì bạn lấy ra đối tượng khách hàng thông qua cùng một bối cảnh bằng cách gọi 'Customers.Find' –

+0

đây là một tham chiếu? –

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