2015-07-28 17 views
11

Tôi đang sử dụng Entity Framework 6.1.1.Làm thế nào để tôi xóa hồ sơ duy nhất từ ​​bảng sử dụng EF 6.1.1

Tôi deleting single record from table như sau nhưng tôi không chắc chắn cho dù con đường duy nhất của nó hay hơn nữa có thể viết lại nó một cách hiệu quả.

Ai đó có thể chia sẻ nhận xét?

Lý do: Tôi hỏi vì nhiều giải pháp trong các bài viết trước đó đề cập đến EF 4.0 và không sử dụng phiên bản mới nhất 6.1.1.

Guid studentId = student.Id; 
StudentReportDetail stuDetails = _context.StudentReportDetail.Find(studentId); 
if (stuDetails != null) 
{ 
    _context.StudentReportDetail.Remove(stuDetails); 
    _context.SaveChanges(); 
} 

Trả lời

24

Không có thay đổi về cách xóa một thực thể giữa EF 4 và EF 6. Để xóa một thực thể sử dụng Entity Framework, bạn cần phải sử dụng phương pháp Remove trên DbSet. Remove hoạt động cho cả hai đối tượng hiện có và mới được thêm cho cả hai đối tượng .

  • Calling Remove trên một thực thể đã được thêm vào nhưng chưa được lưu cơ sở dữ liệu sẽ hủy bỏ việc bổ sung các thực thể. Pháp nhân được xóa khỏi trình theo dõi thay đổi và không còn được theo dõi bởi DbContext.

  • Calling Remove trên một thực thể tồn tại mà đang được thay đổi-theo dõi sẽ đăng ký thực thể để xóa lần sau SaveChanges là gọi.

Xóa với tải từ cơ sở dữ liệu

Như ví dụ bạn hiển thị trong câu hỏi của bạn, bạn cần phải nạp đầu tiên thực hiện từ ngữ cảnh của bạn để xóa nó. Nếu bạn không biết Id, bạn có thể thực hiện một truy vấn như tôi hiển thị bên dưới để tìm thấy nó đầu tiên:

var report= (from d in context.StudentReportDetail 
       where d.ReportName == "Report" 
       select d).Single(); 

    context.StudentReportDetail.Remove(report); 
    context.SaveChanges(); 

Xóa mà không cần tải từ cơ sở dữ liệu

Nếu bạn cần phải xoá bỏ một thực thể, nhưng nó đã không có trong bộ nhớ, nó là một chút không hiệu quả để lấy thực thể đó từ cơ sở dữ liệu chỉ để xóa nó. Nếu bạn biết khóa của đối tượng bạn muốn xóa, bạn có thể đính kèm một số stub đại diện cho đối tượng sẽ bị xóa và sau đó xóa số này stub. A stub là phiên bản của thực thể chỉ được gán giá trị khóa. Giá trị quan trọng là tất cả những gì cần thiết để xóa đối tượng.

var toDelete = new StudentReportDetail {Id = 2 }; 

context.StudentReportDetail.Attach(toDelete); 
context.StudentReportDetail.Remove(toDelete); 
context.SaveChanges(); 

Cách khác có thể thay đổi trạng thái của thực thể thành Deleted. DbContext có phương pháp gọi là EntryEntry<TEntity>, những phương pháp này có được một DbEntityEntry cho thực thể nhất định và cung cấp quyền truy cập vào các thông tin về thực thể và trả về một đối tượng DbEntityEntry thể thực hiện hành động trên thực thể.Bây giờ bạn có thể thực hiện các hoạt động xóa vào bối cảnh bằng cách chỉ thay đổi trạng thái thực thể để EntityState.Deleted:

var toDelete = new StudentReportDetail {Id = 2 }; 
context.Entry(toDelete).State = EntityState.Deleted; 
context.SaveChanges(); 

Sử dụng một thư viện của bên thứ 3

Có một cách khác nhưng đang sử dụng một thư viện của bên thứ 3, EntityFramework Plus , có một gói nugget bạn có thể cài đặt. Bạn có thể sử dụng thao tác xóa hàng loạt:

context.StudentReportDetail 
    .Where(u => u.Id== stuDetails) 
    .Delete(); 
+0

cảm ơn lời giải thích của kẻ thù. Làm thế nào về "modelBuilder.Entity () .HasOptional (x => x.Dependant) .WithOptionalDependent(). WillCascadeOnDelete() trong lớp initialiaztion bối cảnh" .. Cái nào tốt hơn? – immirza

+0

lời giải thích ở trên của bạn cho câu hỏi được đăng của tôi là tuyệt vời và làm cho khái niệm của tôi rất rõ ràng Về sau, tôi xác nhận một điểm khác trong các nhận xét ở trên của tôi về "Cascade deletion for 1-1 relationship". Tôi nghĩ rằng đó sẽ là giải pháp tốt đẹp để thực hiện xóa tầng. Để xóa bình thường câu trả lời của bạn là tuyệt vời và tôi rất rõ ràng về nó. Bạn sẽ nói gì về thực hành để xóa thác? – immirza

+0

vấn đề duy nhất ở đây là một ngoại lệ được ném nếu một thực thể với id đã cho không tồn tại trong db. Có cách nào xung quanh đó không? Nếu không, tôi sẽ cần phải làm một cái gì đó như context.Any (x => x.Id = id) trước đó, mà sẽ đánh bại đối tượng này. –

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