2011-12-27 55 views
11

Có cách nào được tích hợp để xóa bằng LINQ to Entites hay không, sử dụng Khóa chính.LINQ to Entities xóa

Hiện nay m việc xung quanh là tạo ra một Stored Procedure gọi DeleteTable (bảng là tên bảng)

và sau đó trong C# LINQ to Entities Tôi chỉ context.DeleteTable (ID)

Là này cách tốt nhất? tùy chọn khác là gì ở đó?

Trả lời

11

Nếu bạn không muốn vào cơ sở dữ liệu để truy xuất tất cả các trường của đối tượng, bạn có thể tạo một thể hiện mới của lớp, đính kèm nó vào một ngữ cảnh mới, loại bỏ và lưu thay đổi. Điều này cho phép EF tạo ra lệnh xóa thích hợp.

using (var context = new MyContext()) 
{ 
    var myObject = new MyObject { ID = 3 }; 
    context.MyObjectSet.Attach(myObject); 
    context.MyObjectSet.DeleteObject(myObject); 
    context.SaveChanges(); 
} 

Lưu ý: điều này sẽ loại trừ ngoại lệ bạn đang cố gắng xóa đối tượng không tồn tại. Điều đó chỉ thích hợp nếu bạn chắc chắn rằng đối tượng tồn tại.

Note 2: điều này giả định bạn đã thiết lập các đơn vị của bạn để tạo ra lệnh xóa tài liệu tham khảo không có các lĩnh vực khác hơn so với ID (có nghĩa là không có tài sản Timestamp, hoặc bất cứ điều gì tương tự mà sẽ được bao gồm trong truy vấn)

+0

Điều đó có thực sự hoạt động không? Ngọt! Điều đó sẽ hữu ích. +1 – BZink

+1

Nó hoạt động, nhưng tôi nên thêm rằng nó chỉ hoạt động nếu lệnh xóa do EF tạo ra không tham chiếu đến các trường khác ngoài ID. Nếu bạn có trường Dấu thời gian, EF sẽ bao gồm trong truy vấn được tạo, nhưng vì nó không biết giá trị để sử dụng, truy vấn sẽ sai. – hvd

5

Cách mặc định là truy vấn đối tượng và sau đó phát hành phương thức .DeleteObject(...).

+1

có này không đòi hỏi 2 chuyến đi đến DB? – michael

+0

Có. Nếu bạn không muốn lập bản đồ hoặc gọi các thủ tục được lưu trữ rõ ràng, bạn có các tùy chọn giới hạn. –

+0

@michael 'Đính kèm 'không cần chuyến đi? –

1

Sử dụng lệnh thực hiện yêu cầu của bạn ra khỏi bối cảnh như:

mycontext.ExecuteCommand("DELETE FROM MYTABLE"); 

hoặc

mycontext.ExecuteCommand("TRUNCATE TABLE MYTABLE"); 

HTH

+0

Có phương thức ExecuteCommand avaialble cho Link to Entites không? hoặc là nó chỉ Link to SQL? – michael

+0

Tệ của tôi. xem ExecuteStoreQuery cho EF. Xem Làm thế nào để: Trực tiếp thực hiện các lệnh chống lại nguồn dữ liệu (http://msdn.microsoft.com/en-us/library/ee358769.aspx) HTH – OmegaMan

+0

Cảm ơn, tôi không bao giờ biết tôi có thể làm điều này trực tiếp từ liên kết đến các thực thể. – michael

2

Bạn có thể sử dụng DbSet<T>.Remove(entity) (Phiên bản 4.1, 4.2) hoặc Các phương thức EntitySet<T>.Remove(entity) (Phiên bản 1.0, 4.0):

YourDbContext.Table.Remove(entityObject); 
+0

Một lần nữa, tôi nghĩ rằng bạn cần phải chọn thực thể trước khi bạn có thể loại bỏ nó? do đó 2 chuyến đi .. Tôi không đúng? – michael

+0

Có, bạn phải truy vấn đối tượng hoặc bạn có thể sử dụng phương pháp 'Đính kèm', được đề xuất bởi @hvd – Jan

2

Tôi sử dụng để tìm kiếm (các) mục cần xóa và sau đó xóa (chúng) bằng phương pháp DeleteObject.

Dim itemToDelete = (From u In db.SOME_TABLE Where u.ID = ID).FirstOrDefault 
db.SOME_TABLE.DeleteObject(itemToDelete) 
db.SaveChanges() 

sử dụng này bên trong một khối catch thử

+0

isnt này làm 2 chuyến đi đến DB? (ví dụ: chọn * từ some_Table trong đó id = Id) sau đó (xóa foo từ some_table ở đó ..)? – michael

+0

Có, nhưng nếu bạn không muốn thực hiện 2 chuyến đi vòng tới DB bạn sử dụng SP nhiều nhất, nhưng bạn ánh xạ các lệnh Insert, Update và Delete lên SP, nếu bạn không map thì bạn sẽ nhận được ngoại lệ UpdateException. – Piyey

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