2013-04-11 31 views
24

Tôi đã sử dụng Add() và gặp phải sự cố khi một thực thể cha mẹ được sao chép trong cơ sở dữ liệu khi Add nhập một đứa trẻ. Sử dụng Attach() giải quyết vấn đề này nhưng tôi muốn biết tại sao chứ không phải là một cách mù quáng vấp ngã.Khi nào sử dụng DbSet <T> .Thêm() vs DbSet <T> .Attach()

+0

Tôi nghĩ rằng http://stackoverflow.com/questions/3920111/entity-framework-4-addobject-vs-attach này hy vọng sẽ trả lời câu hỏi của bạn –

+0

Cảm ơn bạn. Điều này cũng giúp: http://stackoverflow.com/a/15310068/1185053 –

Trả lời

25

Vâng, khi bạn sử dụng Attach bạn cho biết ngữ cảnh rằng thực thể đã có trong cơ sở dữ liệu, SaveChanges sẽ không có tác dụng đối với các thực thể được đính kèm. Add, mặt khác, thay đổi trạng thái của thực thể trong ngữ cảnh (nếu nó đã có) thành Added, có nghĩa là nó sẽ luôn chèn thực thể trong cơ sở dữ liệu khi bạn gọi SaveChanges.

Đó là sự khác biệt.

+0

Cảm ơn bạn đã phản hồi. Tại sao sau đó trong một 'Controller' được tạo tự động trong Edit, nó sử dụng' db.Entry (model) .State = EntityState.Modified; db.SaveChanges(); 'và không' Đính kèm() '? –

+1

Bởi vì khi bạn 'Attach()' một thực thể đã nằm trong ngữ cảnh ** **, vì nó là trường hợp của thực thể được lưu trữ ở biến 'model', nó đặt trạng thái của thực thể thành' Unchanged', do đó nếu bạn sử dụng 'Attach()' cho mục đích này, thực thể của bạn sẽ không được cập nhật khi bạn gọi 'SaveChanges()'. –

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