Cập nhật dữ liệu khi người dùng thêm, xóa, sửa cùng một lúc

Giả sữ em có 1 bảng danh sách các mặt hàng người dùng đặt và 1 bảng hóa đơn. Trước đó người dùng đã đặt rồi, nhưng sao đó người dùng sửa lại. Nếu người dùng vừa sửa số lượng, vừa chọn thêm mặt hàng mới, vừa xóa mặt hàng cũ và submit 1 lượt. Làm thế nào để sql hiểu là cái nào là thêm, cái nào là xóa, cái nào là sửa không ạ. Trước đây em toàn xóa hết cái cũ và insert tất cả lại :smile: . Cho em xin từ khóa để google ạ. em không biết phải search gì :frowning: . Em dùng c# với EF ạ

Bạn nên có 1 bảng mặt hàng 1 bảng hóa đơn. Trong bảng hóa đơn có 1 field là list các mặt hàng đặt. Lúc sửa thì sửa 1 record trên bảng hóa đơn là được rồi

Em chưa hiểu lắm. Trong csdl thì bảng hóa đơn và mặt hàng sẽ sinh ra 1 bảng chứa danh sách các mặt hàng của hóa đơn. ý bác có phải là cái thuộc tính ICollection trên Model hóa đơn không ạ ?

Bảng order_items có khóa là order_id. Bảng này chứa variation info, quantity…vv. Bảng order 1-n order-items. Bạn có sửa xóa thì có vấn đề gì nhỉ mình. Vẫn chưa hiểu lắm

1 Like

Nhưng em thắc mắc 1 điều là.
Giả sử em có một oder người dùng đã đặt rồi. gồm các items:

  • item 1 quantity: 10
  • item 2 quantity: 20
  • item 3 quantity: 30
  • item 5 quantity: 10
    Bây giờ người dùng vào web và sửa order thành:
  • item 1 quantity: 20
  • item 3 quantity: 30
  • item 4 quantity: 10
  • item 5 quantity: 10
    Tức lúc này người dùng đã sửa quantyti item1, Xóa item2, và thêm item4, item5 không thay đổi. Sau đó submit lên 1 lượt. Trước đây em sẽ xóa danh sách item ban đầu, và insert lại danh sách item mới sửa, Nên em thắc mắc có cách nào để sql nó hiểu rằng là item1 bị sữa nó sửa item1, item2 xóa thì n xóa item2, và item4 insert thì n sẽ add item4. item5 không thay đổi thì nó giữ nguyên.

Có hai giải pháp:

  1. Đơn giản nhất là : khi user sửa, thêm, del một dòng bạn cập nhật ngay; tuy nhiên màn hình add master detail sẽ có vấn đề là chưa có id marster làm sao cập nhật detail (nhược điểm)

  2. Cách 2 phức tạp : Bạn phải tổ chức một record set tại client, ít nhất có 2 field phụ là id và state
    2.a Trường hợp edit master detail

    • khi load form bạn cập nhật id là id trong csdl, state=“ori”
    • khi user add vào detail bạn cài id là số âm, giảm dần, state=“new”
    • Khi user delete 1 record detail sẽ có 2 trương hợp
      …1: nếu id < 0 bạn cứ remove nó ra khỏi record set thoải mái
      …2: nếu id > 0 bạn set state =“del”
    • Khi user edit record detail có hai trường hợp
      …1 : nếu id < 0 thì bạn cứ cập nhật nội dung các field thoải mái
      …2: nếu id > 0 thì sau khi cập nhật nội dung các field bạn set state sang trạng thái “edit”

      Đại khái như thế, chúc bạn thành công
1 Like

Vâng em hiểu rồi. đọc 3 lần mới hiểu bác nói gì :smile: đề em áp dụng thử. em cám ơn

Em đọc về transaction nhé

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?