Tôi đã làm việc với Entity Framework 4 gần đây và tôi hơi bối rối khi sử dụng ObjectSet.Attach và ObjectSet.AddObject .
Từ sự hiểu biết của tôi:
- Sử dụng "Đính kèm" khi một Thực thể đã tồn tại trong hệ thống
- Sử dụng "AddObject" khi tạo một thực thể hoàn toàn mới
Vì vậy, nếu tôi đang tạo một Người mới , tôi sẽ làm điều này.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
Nếu tôi đang sửa đổi một Người hiện có , tôi sẽ làm điều này:
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
Hãy ghi nhớ, đây là một ví dụ rất đơn giản . Trong thực tế, tôi đang sử dụng Pure POCO (không tạo mã), mẫu Kho lưu trữ (không giao dịch với ctx.Persons) và Đơn vị công việc (không giao dịch với ctx.SaveChanges). Nhưng "dưới vỏ bọc", trên đây là những gì xảy ra trong quá trình thực hiện của tôi.
Bây giờ, câu hỏi của tôi - tôi vẫn chưa tìm thấy một kịch bản mà tôi đã phải sử dụng Đính kèm .
Tôi đang thiếu gì ở đây? Khi nào chúng ta cần sử dụng Đính kèm?
BIÊN TẬP
Để làm rõ, tôi đang tìm ví dụ về thời điểm sử dụng Đính kèm qua AddObject (hoặc ngược lại).
CHỈNH SỬA 2
Câu trả lời dưới đây là chính xác (mà tôi đã chấp nhận), nhưng nghĩ rằng tôi sẽ thêm một ví dụ khác trong đó Đính kèm sẽ hữu ích.
Trong ví dụ trên của tôi để sửa đổi một Người hiện có , hai truy vấn đang thực sự được thực thi.
Một để truy xuất Person (.SingleOrDefault) và một để thực hiện CẬP NHẬT (.SaveChanges).
Nếu (vì một số lý do), tôi đã biết rằng "Joe Bloggs" tồn tại trong hệ thống, tại sao phải truy vấn thêm để có được anh ta trước? Tôi có thể làm điều này:
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
Điều này sẽ dẫn đến chỉ một câu lệnh CẬP NHẬT được thực thi.