2016-12-07 18 views
5

Trong khi tìm kiếm các thực hành tốt nhất để thực hiện thao tác CRUD qua EF, tôi nhận thấy rằng bạn nên sử dụng các phương pháp Attach() hoặc Find() trước khi cập nhật một thực thể. Nó hoạt động tốt và theo tài liệu EF, các phương thức này lấy thực thể đến ngữ cảnh khá rõ ràng đối với tôi. Nhưng mã theo dõi đã nhầm lẫn tôi khá nhiềuTại sao nên sử dụng Đính kèm để cập nhật Entity Framework 6?

public void Update(object entity) 
{ 
    Record record = new Record() { 
     id = 1, 
     value = 5 
    }; 
    using (SomeContext ctx = new SomeContext()) 
    { 
     ctx.Entry(record).State = EntityState.Modified; 
     ctx.SaveChanges(); 
    } 
} 

Giả sử chúng tôi có hồ sơ với id = 1 trong cơ sở dữ liệu. Trong điều kiện này, mã ở trên sẽ cập nhật bản ghi (đặt giá trị thành 5). Câu hỏi đặt ra là tại sao nó hoạt động? Và tại sao tôi nên sử dụng Attach()?. Theo như tôi hiểu, hồ sơ không gắn liền với bối cảnh theo bất kỳ cách nào. Tôi đọc các chương có liên quan của this sách và the tutorial nhưng chúng sử dụng phương pháp tiếp cận 2 truy vấn. Ngoài ra tôi lướt SO nhưng không tìm thấy câu trả lời về câu hỏi của tôi. Giúp tôi với lời giải thích hoặc một số matherials tốt, xin vui lòng.

Trả lời

12

Nếu bạn có một thực thể mà bạn biết đã tồn tại trong cơ sở dữ liệu nhưng hiện không được theo dõi bởi ngữ cảnh như trường hợp của bạn thì bạn có thể nói ngữ cảnh theo dõi thực thể bằng cách sử dụng phương thức Attach trên DbSet. Tóm lại, phương pháp Attach là theo dõi thực thể trong ngữ cảnh và thay đổi trạng thái của nó thành Unchanged. Khi bạn sửa đổi một số thuộc tính sau đó thay đổi theo dõi sẽ thay đổi trạng thái của nó thành Modified cho bạn. Trong trường hợp bạn vạch trần ở trên, bạn đang nói rõ ràng rằng trạng thái là Modified nhưng điều đó cũng gắn thực thể vào ngữ cảnh của bạn. Bạn có thể tìm thấy giải thích chi tiết trong số post này.

Khi nào bạn nên sử dụng phương thức Attach?

Khi bạn có một thực thể mà bạn biết đã tồn tại trong cơ sở dữ liệu nhưng muốn thực hiện một số thay đổi:

var entity= new Entity{id=1}; 
context.YourDbSet.Attach(entity); 

// Do some change... 
entity.value=5; 

context.SaveChanges(); 

này là như nhau:

context.Entry(entity).State = EntityState.Unchanged; 

// Do some change... 
entity.value=5; 

context.SaveChanges(); 

Khi bạn nên thay đổi thực thể của Nhà nước để sửa đổi một cách rõ ràng?

Khi bạn có một thực thể mà bạn biết đã tồn tại trong cơ sở dữ liệu nhưng các thay đổi đã được thực hiện rồi. Kịch bản tương tự của ví dụ của bạn

+0

cảm ơn bạn, nhưng tại sao hồ sơ này hiện được theo dõi bởi ngữ cảnh? –

+0

Nếu thực thể hiện được theo dõi và bạn thay đổi một số thuộc tính, trạng thái của thực thể phải thay đổi thành 'Đã sửa đổi' do thay đổi theo dõi, nhưng để thực thể của bạn phải đáp ứng [yêu cầu] này (https://msdn.microsoft.com/ vi/us/dd468057 (v = vs.100) .aspx) – octavioccl

+0

Tôi nghĩ [link] này (https://www.safaribooksonline.com/library/view/programming-entity-framework/9781449331825/ch04s03.html) có thể trả lời tất cả các câu hỏi của bạn – octavioccl

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