Bài 4 Cập nhật cơ sở dữ liệu
2. Các ví du Insert và Delete
Ngoài việc cập nhật các dòng đã có trong CSDL, LINQ to SQL còn cho phép bạn thêm và xóa dữ liệu. Bạn có thể làm được điều này bằng việc thêm/bớt các đối tượng dừ liệu từ các tập hợp bảng
trong lớp DataContext, và sau đó gọi SubmitChanges(). LINQ to SQL sẽ lưu vết lại các thao tác này, và tự động thực thi câu lệnh SQL INSERT hay DELETE phù hợp khi phương thức SubmitChangesO được gọi.
a. Thêm một sản phẩm
Bạn có thế thêm một sản phẩm mới vào CSDL bằng việc tạo ra một đối tượng thuộc lớp “Product”, gán các giá trị thuộc tính, và sau đó thêm nó vào tập hợp “Products” của DataContext:
^Northwi ndD ataContext northwind = n ew N orth w in d D ataC on textO ; Product myProduct = new P r o d u c t o ;
m yProduct. ProductName = " S c o t t 's S p e c ia l Product";
m yProduct. U n itP r ic e = 999;
m yProduct. U n itsIn S to c k = 1;
m yProduct.C ategorylD = 1;
northw i n d .P r o d u c ts . A dd(m yProduct);
n orth w in d . Submi tch a n g es C);
Khi gọi “SubmitChanges” như trên, một dòng mới sẽ được thêm vào bảng Product.
b. Xóa các sản phẩm
Cũng như tôi đã nói về việc thêm một sẳn phẩm mới bàng cách đổi tượng Product vào tập hợp Products của DataContext, tôi cũng có thế làm một cách ngược lại khi muốn xóa một sản phấm từ CSDL bằng cách xóa nó khỏi tập họp này:
N o r t h w i n d D a t a C o n t e x t n o r t h w i n d = new N o r t h w i n d D a t a C o n t e x t O; v a r la m e P r o d u c t s = fro m p i n n o r t h w in d .P r o d u c t s
w h e re p .O r d e r D e t a il s .C o u n t > o && p.D is c o n t in u e d == t r u e
s e l e c t p ;
n o r t h w in d .P r o d u c t s .R e m o v e A ll( la m e P r o d u c t s ) ;
J i o r t h w i n d . S u b m i t c h a n g e s o ;____________________________________________________________________________________________
(RcmoveAll đã được thay đối bằng DeleteOnSubmit trong phiên bản hiện tại)
Chú ý cách tôi lấy một tập hợp các sản phấm không còn được sản xuất và cũng không có đơn đặt hàng nào bằng cách dùng một câu truy vấn LINỌ, rồi sau đó truyền nó cho phương thức RemoveAll của tập hợp Products trong DataContext. Khi gọi SubmitChanges(), tất cả các sản phấm đó sẽ bị xóa khói CSDL.
mồi Product trong một Category, mồi Order để chứa các OrderDetails cho từng mục, kết họp các OrderDctail với một Product, và làm cho mồi Customer kết hợp với một tập các Order. Tôi đã biểu diễn cách xây dựng và mô hình hóa các mối quan hệ trong phần 2 của loạt bài này.
LINQ to SQL cho phép tôi tận dụng được ưu điểm của các mối quan hệ trong việc truy vấn và cập nhật dừ liệu. Ví dụ, tôi có thể viết đoạn lệnh dưới đây đề tạo một Product mới và kết họp nó với một category “Beverages” trong CSDL như dưới đây:
N o r t h w i n d D a t a C o n t e x t n o r th w in d = new N o r t h w i n d D a t a C o n t e x t Q; // Retrieve beverages category
C a t e g o r y b e v e ra g e s = n o r t h w i n d .C a t e g o r i e s .S i n g l e f c => c.C a te g o ry N a m e == " B e v e r a g e s " ) ; // Create new Product
P ro d u c t m yP ro d u ct = new P r o d u c t O ;
m y P ro d u c t. ProductN am e = "Scott's Special Product";
m y P r o d u c t .U n it P r ic e = 9 9 9 ; m y P r o d u c t .U n it s In S t o c k = 1 ;
// Associate product with beverage category b e v e r a g e s . P r o d u c t s . A d d (m y P ro d u c t);
// Update database
n o rth w i n d . Submi t c h a n g e s ( ) ;
(Add đã được thay đối bàng InsertOnSubmit trong phiên bản hiện tại)
Hãy chú ý cách tôi thêm một đối tượng Product vào tập hợp Products của một Category. Nó sẽ chỉ ra ràng có một mối quan hệ giữa hai đối tượng, và làm cho LĨNQ to SQL tự động duy trì mối quan hệ foreign-key/primary key giữa cả hai khi tôi gọi SubmitChanges.
Một ví dụ khác cho thấy LINỌ to SQL có thể giúp quản lý quan hệ giữa các bảng như thế nào và giúp cho việc lập trình sáng sủa hơn, hãy xem một ví dụ dưới đây khi tôi tạo một Order mới cho một khách hàng đã có. Sau khi đặt giá trị cho ngày chuyển hàng và chi phí cho việc đặt hàng, tôi sẽ tạo tiếp 2 mục chi tiết trong đơn đặt hàng để chỉ đến các sản phấm mà khách hàng đang muốn mua. Sau đó, tôi sẽ kết họp đon đặt hàng với khách hàng, và cập nhật các thay đối vào CSDL.
^ N o rt h w i n d D a t a C o n te x t n o r t h w in d = new N o r t h w in d D a t a C o n t e x t O ; / / R e t r ie v e p rod uct d e t a il s
Product ch a i = n o rth w in d .P ro d u c ts . S in g !e (p => p.ProductName == " C h a i" ) ; Product to fu = n o r t h w in d .P r o d u c ts .S in g le (p => p.ProductName == " T o f u " );
/ / C re a te new O rder and O rder l i n e item s f o r p rod ucts Order myOrder = new O rd e r O ;
m yO rder.OrderDate = DateTime.Now;
myOrder. Req uiredD ate = DateTime.Now.AddDays( 1 ) ; m y O rd e r.F re ig h t = 34;
OrderDetai1m yltem l = new OrderDetai1();
m y lte m l.P ro d u c t = c h a i;
m y lte m l.Q u a n tity = 23;
OrderDetai! myltem2 = new OrderDetai1();
myltem2. P ro du ct = t o fu ; m ylte m 2 .Q u an tity = 3;
/ / A s s o c ia te new o rd e r and o rd e r l i n e item s to g e th e r myOrder.OrderDetaiIs.Add(mylteml);
m y O rd e r.O rd e rD e ta iIs . A dd(m yltem 2);
/ / R e t r ie v e custom er d e t a il s
Customer myCustomer = n o rth w in d .C u sto m e rs. S in g le ( c => c.CompanyName == " B 's B e v e ra g e s " );
/ / Add th e o rd e r to th e c u sto m e r's O rders c o lle c t io n m yCustom er.O rders. Add(m yO rder);
/ / Update database
^ northw i nd. Submi tchanges ( ) ; ________________________________________________________________________________________^
(Add đã được thay đồi bằng InsertOnSubmit trong phiên bản hiện tại)
Như bạn thấy, mô hình lập trình trên cho phép thực hiện tất cả các công việc này một cách cực kỳ sáng sủa theo phong cách hướng đối tượng.