2 Câu hỏi: DbSet.Attach (thực thể) so với DbContext.Entry (thực thể) .State = EntityState.Modified

câu hỏi được tạo ra tại Tue, Jun 23, 2015 12:00 AM

Khi tôi ở trong một kịch bản tách rời và nhận được một dto từ máy khách mà tôi ánh xạ vào một thực thể để lưu nó, tôi làm điều này:

 49 310

Vì cái gì là 49 310

hoặc tại sao tôi nên sử dụng phương thức .Attach khi EntityState.Modified đã đính kèm thực thể?

    
95
  1. Tốt hơn là thêm một số thông tin phiên bản, điều này đã được hỏi trước đó. Tôi không rõ liệu điều này có xứng đáng với một câu hỏi mới không.
    2015-06-22 19: 06: 48Z
2 Câu trả lời                              2                         

Khi bạn thực hiện 49 310, bạn không chỉ gắn thực thể vào 49 310, bạn còn đánh dấu toàn bộ thực thể là bẩn. Điều này có nghĩa là khi bạn thực hiện 49 310, EF sẽ tạo một câu lệnh cập nhật sẽ cập nhật tất cả các trường của thực thể.

Điều này không phải lúc nào cũng mong muốn.

Mặt khác, 49 310 gắn thực thể vào bối cảnh mà không đánh dấu nó bẩn. Nó tương đương với việc thực hiện 49 310

Khi đính kèm theo cách này, trừ khi bạn tiến hành cập nhật một thuộc tính trên thực thể, lần sau khi bạn gọi 49 310, EF sẽ không tạo cập nhật cơ sở dữ liệu cho thực thể này.

Ngay cả khi bạn dự định thực hiện cập nhật cho thực thể, nếu thực thể đó có nhiều thuộc tính (cột db) nhưng bạn chỉ muốn cập nhật một vài, bạn có thể thấy thuận lợi khi thực hiện 49 310, và sau đó chỉ cập nhật một vài thuộc tính cần cập nhật. Làm theo cách này sẽ tạo ra một tuyên bố cập nhật hiệu quả hơn từ EF. EF sẽ chỉ cập nhật các thuộc tính bạn đã sửa đổi (ngược lại với 49 310, điều này sẽ khiến tất cả các thuộc tính /cột được cập nhật)

Tài liệu liên quan: Thêm /Đính kèm và Thực thể .

Ví dụ mã

Giả sử bạn có thực thể sau:

 49 310

Nếu mã của bạn trông như thế này:

 49 310

SQL được tạo sẽ trông giống như thế này:

 49 310

Lưu ý cách tuyên bố cập nhật ở trên sẽ cập nhật tất cả các cột, bất kể bạn có thực sự thay đổi giá trị hay không.

Ngược lại, nếu mã của bạn sử dụng Đính kèm "bình thường" như thế này:  49 310

Sau đó, câu lệnh cập nhật được tạo là khác nhau:

 49 310

Như bạn có thể thấy, câu lệnh cập nhật chỉ cập nhật các giá trị đã thực sự thay đổi sau khi bạn gắn thực thể vào ngữ cảnh. Tùy thuộc vào cấu trúc của bảng của bạn, điều này có thể có tác động hiệu suất tích cực.

Bây giờ, tùy chọn nào tốt hơn cho bạn phụ thuộc hoàn toàn vào những gì bạn đang cố gắng làm.

    
242
2016-10-17 23: 14: 32Z
  1. EF không tạo ra mệnh đề WHERE theo cách này. Nếu bạn đã đính kèm một thực thể được tạo bằng mới (tức là Thực thể mới ()) và đặt nó thành sửa đổi, bạn phải đặt tất cả các trường ban đầu vì khóa lạc quan. Mệnh đề WHERE được tạo trong truy vấn CẬP NHẬT thường chứa tất cả các trường ban đầu (không chỉ Id), vì vậy nếu bạn không làm như vậy thì EF sẽ ném ngoại lệ tương tranh.
    2015-06-24 09: 03: 12Z
  2. @ budi: Cảm ơn bạn đã phản hồi. Tôi đã kiểm tra lại để chắc chắn, và đối với một thực thể cơ bản, nó hoạt động như tôi đã mô tả, với mệnh đề 49 310 chỉ chứa khóa chính và không có bất kỳ kiểm tra tương tranh nào. Để kiểm tra đồng thời, tôi cần định cấu hình rõ ràng một cột dưới dạng mã thông báo đồng thời hoặc rowVersion. Trong trường hợp đó, mệnh đề 49 310 sẽ chỉ có khóa chính và cột mã thông báo đồng thời, không phải tất cả các trường. Nếu các thử nghiệm của bạn hiển thị khác, tôi rất muốn nghe về nó.
    2015-06-25 13: 23: 25Z
  3. làm cách nào tôi có thể tự động tìm thuộc tính phù thủy được sửa đổi?
    2016-07-18 11: 10: 01Z
  4. @ Navid_pdp11 49 310 và 49 310.
    2017-05-09 20: 32: 22Z

Khi bạn sử dụng phương thức 49 310, Khung thực thể đánh dấu tất cả các thuộc tính của thực thể của bạn là 49 310, vì vậy hãy theo dõi chúng. Nếu bạn chỉ muốn thay đổi một số thuộc tính của mình, không phải tất cả các thuộc tính, hãy sử dụng 49 310. Phương pháp này tạo ra tất cả các thuộc tính của bạn 49 310, vì vậy bạn phải tạo các thuộc tính mà bạn muốn cập nhật 49 310. Do đó, khi ứng dụng đạt đến 49 310, nó sẽ chỉ vận hành các thuộc tính được sửa đổi.

    
0
2017-09-15 07: 27: 38Z
context.Entry(entity).State = EntityState.Modified;
context.SaveChanges();
nguồn đặt đây