Varlık Çerçevesi .Remove () ve .DeleteObject ()


Yanıtlar:


275

Her iki yöntemle de " bir öğeyi veritabanından kaldırabileceğiniz " genellikle doğru değildir . Kesin olmak gerekirse şöyle:

  • ObjectContext.DeleteObject(entity)varlığıDeleted bağlamdaki gibi işaretler . (O var EntityStateolan Deletedbundan sonra.) Eğer çağırırsanız SaveChangessonradan EF SQL gönderir DELETEveritabanına deyimi. Veritabanındaki hiçbir referans kısıtlaması ihlal edilmezse varlık silinir, aksi takdirde bir istisna atılır.

  • EntityCollection.Remove(childEntity)üst ve childEntityas arasındaki ilişkiyiDeleted işaretler . Eğer childEntitykendisi veritabanından silinmiş ve dediğiniz şey tam olarak ne zaman olur edilir SaveChangesikisi arasındaki ilişkinin türüne bağlıdır:

    • İlişki isteğe bağlıysa , yani veritabanındaki alt öğeden üst öğeye başvuran yabancı anahtar NULLdeğerlere izin verirse, bu yabancı değer null olarak ayarlanır ve SaveChangesbu NULLdeğeri çağırırsanız childEntityveritabanına yazılır (örneğin, ikisi kaldırılır). Bu bir SQL UPDATEdeyimi ile olur . Açıklama yapılmaz DELETE.

    • İlişki gerekiyorsa (FK NULLdeğerlere izin vermiyorsa ) ve ilişki tanımlanmıyorsa (yabancı anahtar çocuğun (bileşik) birincil anahtarının bir parçası olmadığı anlamına gelir), çocuğu başka bir ebeveyne eklemeniz veya çocuğu açıkça silmeniz gerekir ( DeleteObjecto zaman ile). Bu bir referans kısıtı ihlal ve Aradığınızda EF bir istisna durumu herhangi yapmazsanız SaveChangesrezil - " ilişki değiştirilemedi bir veya daha fazla yabancı anahtar özelliklerinin olmayan null olduğu için " istisna veya benzer.

    • İlişki ise tanımlama (bu mutlaka oluyor gerekli birincil anahtarın herhangi parçası olamaz çünkü o zaman NULL) EF işaretler childEntityolarak Deletedsıra. Aradığınızda veritabanına SaveChangesbir SQL DELETEdeyimi gönderilir. Veritabanındaki başka hiçbir başvuru kısıtlaması ihlal edilmezse varlık silinir, aksi takdirde bir istisna atılır.

Aslında bağlandığınız MSDN sayfasındaki Açıklamalar bölümü hakkında biraz kafam karıştı çünkü şöyle diyor: " İlişkinin bir başvuru bütünlüğü kısıtlaması varsa, bağımlı bir nesnede Remove yöntemini çağırmak, ilişkiyi ve bağımlı nesneyi silmek için işaretler. ". Bu benim için kesin değil, hatta yanlış görünüyor, çünkü yukarıdaki üç vakanın tamamında " referans bütünlüğü kısıtlaması " var, ancak sadece son durumda çocuk aslında siliniyor. (" Bağımlı nesne " ile kastetmedikçe, alışılmadık bir terminoloji olabilecek tanımlayıcı bir ilişkiye katılan bir nesne.)


2
Başvuru Bütünlüğü wikipedia: Başvuru bütünlüğü, tatmin olduğunda, bir ilişkinin (tablonun) bir niteliğinin (sütunun) her değerinin farklı (veya aynı) ilişkideki (tablonun) başka bir özelliğinin değeri olarak var olmasını gerektiren bir veri özelliğidir. ), bu yüzden ilişki İsteğe bağlı olduğunda veri Dürüstlük kuralını
Mohammadreza

3
@Mohammadreza: Eğer NULL"bir değer değil" olarak yorumluyorsanız ( NULLbazen biraz özensiz yazdığım gibi "değer" yerine ) o zaman "isteğe bağlı bir ilişki" referans bütünlüğünün tanımıyla çelişmez.
Slauma

1
Peki EF Core sürümü ObjectContext.DeleteObjectnedir?
Jonathan Allen

13

Gerçekten Silinmiş'i kullanmak istiyorsanız, yabancı anahtarlarınızı boş bırakmanız gerekir, ancak daha sonra artık kayıtlarla sonuçlanırsınız (bu, ilk etapta yapmamanız gereken temel nedenlerden biridir). Sadece kullanRemove()

ObjectContext.DeleteObject (entity) , varlığı bağlamda Silindi olarak işaretler. (Bundan sonra EntityState silinir.) Sonra SaveChanges çağırırsanız EF veritabanına bir SQL DELETE deyimi gönderir. Veritabanındaki hiçbir referans kısıtlaması ihlal edilmezse varlık silinir, aksi takdirde bir istisna atılır.

EntityCollection.Remove (childEntity) , parent ve childEntity arasındaki ilişkiyi Silindi olarak işaretler. ChildEntity'nin kendisi veritabanından silinirse ve SaveChanges'i çağırdığınızda tam olarak ne olursa, ikisi arasındaki ilişkinin türüne bağlıdır:

Dikkate değer bir şey, ayarın .State = EntityState.Deleted otomatik olarak algılanan değişikliği tetiklememesidir. ( arşiv )


4
Tamam, cevabımı aşağıya oylayanlar için bunun Slauma'nınki ile hiçbir ilgisi yok - her ikisi de aynı belgelere işaret ediyor . Mine, teorisinin bir parçasıyken gerçek hayattan örnekleri açıklar.
Matas Vaitkevicius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.