Entity Framework Remove() vs DeleteObject()
Selamlar,
Aşağıdaki iki yöntemle EF'yi kullanarak veritabanından bir öğeyi kaldırabilirsiniz.
EntityCollection.Remove Yöntemi
ObjectContext.DeleteObject Yöntemi
Birincisi EntityCollection ve ikincisi ise ObjectContext üzerindedir.
Bunlar ne zaman kullanılmalıdır?
Biri diğerinden daha mı iyi? Remove () bir bool döndürür, DeleteObject () void döndürür.
Aslında her iki yöntemle de "bir öğeyi veritabanından kaldırır" demek doğru değildir.
Kesin olmak gerekirse şöyle:
ObjectContext.DeleteObject, belirttiğiniz objeyi silindi olarak işaretler. (Bundan sonra EntityState silinir.) SaveChanges'ı daha sonra çağırırsanız, EF veritabanına bir SQL DELETE deyimi gönderir. Veritabanında referanssal kısıtlamalar ihlal edilmezse (yani ilişkili tablolarla ilgili durum gözden kaçırılmazsa), metoda gönderdiğiniz obje silinir, aksi halde bir istisna (throw) atılır.
EntityCollection.Remove (childEntity), ebeveyni ve childEntity arasındaki ilişkiyi silinmiş olarak işaretler. ChildEntity'nin kendisi veritabanından silinirse ve SaveChanges'i çağırdığınızda, tam olarak ne olur, ikisi arasındaki ilişkinin türüne bağlıdır:
- İlişki isteğe bağlıysa, diğer bir deyişle, veritabanındaki başvuran FK, NULL değerlerine izin veriyorsa, bu FK null değerine ayarlanır ve SaveChanges'ı çağırırsanız childEntity için bu NULL değeri veritabanına yazılır (yani ikisi arasındaki ilişki kaldırılır). Bu bir SQL UPDATE deyimi ile olur. Delete ifadesiyle değil bu arada.
- İlişki gerekli ise (FK NULL değerlerine izin vermiyorsa) ve ilişki tanımlanmıyorsa (bunun anlamı FK anahtarı, PK'nın çocuğu olmadığı anlamına gelir -yani veri yanlışlığı var-), ya child olarak veriyi başka bir tabloya eklemeniz gerekiyor ya da açıkçası o değeri silmeniz gerekiyor -DeleteObject ile-. Eğer bunların hiçbirini yapmazsanız, SaveChanges'i çağırdığınızda EF sizi exception'a fırlatacak ve şöyle bir hata verecek: "The relationship could not be changed because one or more of the foreign-key properties is non-nullable". Yani ilişkilendirilemedi hatası.
- İlişki tanımlanıyorsa (PK'nın herhangi bir kısmı NULL olamaz olduğu için mutlaka gereklidir) EF, childEntity'yi de silinmiş olarak işaretleyecektir. SaveChanges'ı çağırırsanız, bir SQL DELETE deyimi veritabanına gönderilecektir. Veritabanında başka hiçbir başvuru kısıtlaması ihlal edilmezse varlık silinir, aksi takdirde bir istisna atılır.
Ancak son durumda nesne siliniyor. İlişkili olan tablolarda farklı bir yapı kullanılıyor. Bu bakımdan ikisi için de sadece siliyor demek yanlış olur.
Referans: MSDN
Bu gönderiyi 09.07.2017 20:58:08 tarihinde Rserit düzenledi.