Basamaklı SilmeCascade Delete

Basamaklı silme genellikle veritabanı terminolojisinde, ilgili satırların silinmesini otomatik olarak tetiklemek için bir satırsilme sağlayan bir özelliği tanımlamak için kullanılır.Cascade delete is commonly used in database terminology to describe a characteristic that allows the deletion of a row to automatically trigger the deletion of related rows. EF Core silme davranışları tarafından da kapsanan yakından ilişkili bir kavram, bir alt varlığın bir üst öğeyle ilişkisi kesildiğinde otomatik olarak silinmesidir - bu genellikle "yetimleri silme" olarak bilinir.A closely related concept also covered by EF Core delete behaviors is the automatic deletion of a child entity when it's relationship to a parent has been severed--this is commonly known as "deleting orphans".

EF Core birkaç farklı silme davranışı uygular ve tek tek ilişkilerin silme davranışlarınıyapılandırmasına olanak tanır.EF Core implements several different delete behaviors and allows for the configuration of the delete behaviors of individual relationships. EF Core ayrıca, ilişkinin gerekliliğinebağlı olarak her ilişki için yararlı varsayılan silme davranışlarını otomatik olarak yapılandıran kuralları da uygular.EF Core also implements conventions that automatically configure useful default delete behaviors for each relationship based on the requiredness of the relationship.

Davranışları silmeDelete behaviors

Silme davranışları DeleteBehavior sayısalator türünde tanımlanır ve bir asıl/üst varlığın silinmesini veya bağımlı/alt varlıklarla ilişkinin kesilmesinin bağımlı/alt varlıklar üzerinde yan etkisi olup olmadığını kontrol etmek için OnDelete akıcı API'sine geçirilebilir.Delete behaviors are defined in the DeleteBehavior enumerator type and can be passed to the OnDelete fluent API to control whether the deletion of a principal/parent entity or the severing of the relationship to dependent/child entities should have a side effect on the dependent/child entities.

Bir asıl/üst varlık silindiğinde veya çocukla ilişki kesildiğinde EF'nin alabilecekleri üç eylem vardır:There are three actions EF can take when a principal/parent entity is deleted or the relationship to the child is severed:

  • Alt/bağımlı silinebilirThe child/dependent can be deleted
  • Çocuğun yabancı anahtar değerleri null ayarlanabilirThe child's foreign key values can be set to null
  • Çocuk değişmeden kalırThe child remains unchanged

Not

EF Core modelinde yapılandırılan silme davranışı yalnızca asıl varlık EF Core kullanılarak silindiğinde ve bağımlı varlıklar belleğe yüklendiğinde (diğer bir deyişle, izlenen bağımlılar için) uygulanır.The delete behavior configured in the EF Core model is only applied when the principal entity is deleted using EF Core and the dependent entities are loaded in memory (that is, for tracked dependents). Bağlam tarafından izlenmeden veri gerekli eylem uygulandığından emin olmak için ilgili basamaklı davranış veritabanında kurulumu gerekir.A corresponding cascade behavior needs to be setup in the database to ensure data that is not being tracked by the context has the necessary action applied. Veritabanını oluşturmak için EF Core'u kullanırsanız, bu basamaklı davranış sizin için kurulum olacaktır.If you use EF Core to create the database, this cascade behavior will be setup for you.

Yukarıdaki ikinci eylem için, yabancı anahtar geçersiz değilse, geçersiz bir yabancı anahtar değeri ayarı geçerli değildir.For the second action above, setting a foreign key value to null is not valid if foreign key is not nullable. (Nullable olmayan yabancı anahtar gerekli bir ilişkiye eşdeğerdir.) Bu gibi durumlarda, EF Core, Yabancı anahtar özelliğinin SaveChanges çağrılana kadar null olarak işaretlendiğini ve değişiklik veritabanına kalıcı hale alınamadığı için bir özel durum atıldığını izler.(A non-nullable foreign key is equivalent to a required relationship.) In these cases, EF Core tracks that the foreign key property has been marked as null until SaveChanges is called, at which time an exception is thrown because the change cannot be persisted to the database. Bu, veritabanından bir kısıtlama ihlali almaya benzer.This is similar to getting a constraint violation from the database.

Aşağıdaki tablolarda listelenen dört silme davranışı vardır.There are four delete behaviors, as listed in the tables below.

İsteğe bağlı ilişkilerOptional relationships

İsteğe bağlı ilişkiler (nullable is yabancı anahtar) için aşağıdaki etkilere neden olan null yabancı anahtar değeri kaydetmek mümkündür:For optional relationships (nullable foreign key) it is possible to save a null foreign key value, which results in the following effects:

Davranış AdıBehavior Name Bellekte bağımlı/alt üzerindeki etkisiEffect on dependent/child in memory Veritabanındaki bağımlı/alt üzerindeki etkisiEffect on dependent/child in database
CascadeCascade Varlıklar silinirEntities are deleted Varlıklar silinirEntities are deleted
ClientSetNull (Varsayılan)ClientSetNull (Default) Yabancı anahtar özellikleri null ayarlanırForeign key properties are set to null NoneNone
SetnullSetNull Yabancı anahtar özellikleri null ayarlanırForeign key properties are set to null Yabancı anahtar özellikleri null ayarlanırForeign key properties are set to null
KısıtlamakRestrict NoneNone NoneNone

Gerekli ilişkilerRequired relationships

Gerekli ilişkiler (nullable yabancı anahtar) için aşağıdaki etkilere neden olan bir null yabancı anahtar değeri kaydetmek mümkün değildir:For required relationships (non-nullable foreign key) it is not possible to save a null foreign key value, which results in the following effects:

Davranış AdıBehavior Name Bellekte bağımlı/alt üzerindeki etkisiEffect on dependent/child in memory Veritabanındaki bağımlı/alt üzerindeki etkisiEffect on dependent/child in database
Basamaklı (Varsayılan)Cascade (Default) Varlıklar silinirEntities are deleted Varlıklar silinirEntities are deleted
Müşteri SetnullClientSetNull SaveChanges atarSaveChanges throws NoneNone
SetnullSetNull SaveChanges atarSaveChanges throws SaveChanges atarSaveChanges throws
KısıtlamakRestrict NoneNone NoneNone

Yukarıdaki tablolarda, Hiçbiri bir kısıtlama ihlaline neden olabilir.In the tables above, None can result in a constraint violation. Örneğin, bir asıl/alt varlık silinirse ancak bağımlı/alt çocuğun yabancı anahtarını değiştirmek için herhangi bir işlem yapılmazsa, veritabanı büyük olasılıkla yabancı kısıtlama ihlali nedeniyle SaveChanges'ı atar.For example, if a principal/child entity is deleted but no action is taken to change the foreign key of a dependent/child, then the database will likely throw on SaveChanges due to a foreign constraint violation.

Yüksek düzeyde:At a high level:

  • Ebeveyni olmadan var olamayan varlıklarınız varsa ve EF'nin çocukları otomatik olarak silmesine özen duymasını istiyorsanız, Ardından Basamaklı'yıkullanın.If you have entities that cannot exist without a parent, and you want EF to take care for deleting the children automatically, then use Cascade.
    • Üst öğeolmadan var olamayan varlıklar genellikle basamaklı varsayılan olan gerekli ilişkilerden yararlar.Entities that cannot exist without a parent usually make use of required relationships, for which Cascade is the default.
  • Bir ebeveyniniz olabilir veya olmayabilir varlıklar varsa ve EF sizin için yabancı anahtarı iptal dikkat çekmek istiyorsanız, o zaman ClientSetNull kullanınIf you have entities that may or may not have a parent, and you want EF to take care of nulling out the foreign key for you, then use ClientSetNull
    • Üst öğesi olmadan var olabilecek varlıklar genellikle ClientSetNull'un varsayılan olduğu isteğe bağlı ilişkilerden yararlar.Entities that can exist without a parent usually make use of optional relationships, for which ClientSetNull is the default.
    • Veritabanının, alt varlık yüklenmese bile null değerlerini alt yabancı anahtarlara yaymayı da denemesini istiyorsanız, SetNull'ukullanın.If you want the database to also try to propagate null values to child foreign keys even when the child entity is not loaded, then use SetNull. Ancak, veritabanının bunu desteklemesi gerektiğini ve veritabanını bu şekilde yapılandırılabilmenizin diğer kısıtlamalara neden olabileceğini ve bunun da uygulamada bu seçeneği genellikle pratik hale getirebileceğini unutmayın.However, note that the database must support this, and configuring the database like this can result in other restrictions, which in practice often makes this option impractical. Bu nedenle SetNull varsayılan değildir.This is why SetNull is not the default.
  • EF Core'un bir varlığı otomatik olarak silmesini veya yabancı anahtarı otomatik olarak iptal etmesini istemiyorsanız, Kısıtla'yıkullanın.If you don't want EF Core to ever delete an entity automatically or null out the foreign key automatically, then use Restrict. Bunun için kodlarınızın alt varlıkları ve yabancı anahtar değerlerini el ile eşitleme de tutmalarını gerektirdiğini unutmayın aksi takdirde kısıtlama özel durumları atılır.Note that this requires that your code keep child entities and their foreign key values in sync manually otherwise constraint exceptions will be thrown.

Not

EF Core'da, EF6'dan farklı olarak basamaklı efektler hemen gerçekleşmez, bunun yerine yalnızca SaveChanges çağrıldığında gerçekleşir.In EF Core, unlike EF6, cascading effects do not happen immediately, but instead only when SaveChanges is called.

Not

EF Core 2.0'daki değişiklikler: Önceki sürümlerde, Kısıtla, izlenen bağımlı varlıklardaki isteğe bağlı yabancı anahtar özelliklerinin null olarak ayarlanmasına neden olur ve isteğe bağlı ilişkiler için varsayılan silme davranışıdır.Changes in EF Core 2.0: In previous releases, Restrict would cause optional foreign key properties in tracked dependent entities to be set to null, and was the default delete behavior for optional relationships. EF Core 2.0'da, ClientSetNull bu davranışı temsil etmek üzere tanıtıldı ve isteğe bağlı ilişkiler için varsayılan oldu.In EF Core 2.0, the ClientSetNull was introduced to represent that behavior and became the default for optional relationships. Kısıtlama davranışı bağımlı varlıklar üzerinde herhangi bir yan etkisi asla ayarlandı.The behavior of Restrict was adjusted to never have any side effects on dependent entities.

Varlık silme örnekleriEntity deletion examples

Aşağıdaki kod, karşıdan yüklenebilecek ve çalıştırılabilen bir örneğin parçasıdır.The code below is part of a sample that can be downloaded and run. Örnek, bir üst varlık silindiğinde hem isteğe bağlı hem de gerekli ilişkiler için her silme davranışı için neler olduğunu gösterir.The sample shows what happens for each delete behavior for both optional and required relationships when a parent entity is deleted.

var blog = context.Blogs.Include(b => b.Posts).First();
var posts = blog.Posts.ToList();

DumpEntities("  After loading entities:", context, blog, posts);

context.Remove(blog);

DumpEntities($"  After deleting blog '{blog.BlogId}':", context, blog, posts);

try
{
    Console.WriteLine();
    Console.WriteLine("  Saving changes:");

    context.SaveChanges();

    DumpSql();

    DumpEntities("  After SaveChanges:", context, blog, posts);
}
catch (Exception e)
{
    DumpSql();

    Console.WriteLine();
    Console.WriteLine($"  SaveChanges threw {e.GetType().Name}: {(e is DbUpdateException ? e.InnerException.Message : e.Message)}");
}

Neler olduğunu anlamak için her varyasyonu gözden geçirelim.Let's walk through each variation to understand what is happening.

DeleteBehavior.Cascade gerekli veya isteğe bağlı ilişki ileDeleteBehavior.Cascade with required or optional relationship

  After loading entities:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  After deleting blog '1':
    Blog '1' is in state Deleted with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  Saving changes:
    DELETE FROM [Posts] WHERE [PostId] = 1
    DELETE FROM [Posts] WHERE [PostId] = 2
    DELETE FROM [Blogs] WHERE [BlogId] = 1

  After SaveChanges:
    Blog '1' is in state Detached with 2 posts referenced.
      Post '1' is in state Detached with FK '1' and no reference to a blog.
      Post '2' is in state Detached with FK '1' and no reference to a blog.
  • Blog Silinmiş olarak işaretlenirBlog is marked as Deleted
  • Basamaklı kaydetmeler SaveChanges kadar gerçekleşmediğinden gönderiler başlangıçta değişmeden kalırPosts initially remain Unchanged since cascades do not happen until SaveChanges
  • SaveChanges hem bağımlılar/çocuklar (gönderiler) hem de ana/üst (blog) için silme gönderirSaveChanges sends deletes for both dependents/children (posts) and then the principal/parent (blog)
  • Kaydedildikten sonra, veritabanından silindikleri için tüm varlıklar ayrılırAfter saving, all entities are detached since they have now been deleted from the database

DeleteBehavior.ClientSetNull veya DeleteBehavior.SetNull gerekli ilişki ileDeleteBehavior.ClientSetNull or DeleteBehavior.SetNull with required relationship

  After loading entities:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  After deleting blog '1':
    Blog '1' is in state Deleted with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  Saving changes:
    UPDATE [Posts] SET [BlogId] = NULL WHERE [PostId] = 1

  SaveChanges threw DbUpdateException: Cannot insert the value NULL into column 'BlogId', table 'EFSaving.CascadeDelete.dbo.Posts'; column does not allow nulls. UPDATE fails. The statement has been terminated.
  • Blog Silinmiş olarak işaretlenirBlog is marked as Deleted
  • Basamaklı kaydetmeler SaveChanges kadar gerçekleşmediğinden gönderiler başlangıçta değişmeden kalırPosts initially remain Unchanged since cascades do not happen until SaveChanges
  • SaveChanges, FK gönderisini null'a ayarlamaya çalışır, ancak FK geçersiz olmadığı için bu başarısız olurSaveChanges attempts to set the post FK to null, but this fails because the FK is not nullable

DeleteBehavior.ClientSetNull veya DeleteBehavior.SetNull isteğe bağlı ilişki ileDeleteBehavior.ClientSetNull or DeleteBehavior.SetNull with optional relationship

  After loading entities:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  After deleting blog '1':
    Blog '1' is in state Deleted with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  Saving changes:
    UPDATE [Posts] SET [BlogId] = NULL WHERE [PostId] = 1
    UPDATE [Posts] SET [BlogId] = NULL WHERE [PostId] = 2
    DELETE FROM [Blogs] WHERE [BlogId] = 1

  After SaveChanges:
    Blog '1' is in state Detached with 2 posts referenced.
      Post '1' is in state Unchanged with FK 'null' and no reference to a blog.
      Post '2' is in state Unchanged with FK 'null' and no reference to a blog.
  • Blog Silinmiş olarak işaretlenirBlog is marked as Deleted
  • Basamaklı kaydetmeler SaveChanges kadar gerçekleşmediğinden gönderiler başlangıçta değişmeden kalırPosts initially remain Unchanged since cascades do not happen until SaveChanges
  • SaveChanges girişimleri, asıl/üst öğeyi (blog) silmeden önce her iki bağımlının/çocuğun (gönderilerin) FK'sını geçersiz kılacak şekilde ayarlarSaveChanges attempts sets the FK of both dependents/children (posts) to null before deleting the principal/parent (blog)
  • Kaydedildikten sonra, asıl/üst (blog) silinir, ancak bağımlılar/çocuklar (gönderiler) hala izlenirAfter saving, the principal/parent (blog) is deleted, but the dependents/children (posts) are still tracked
  • İzlenen bağımlılar/çocuklar (gönderiler) artık null FK değerlerine sahiptir ve silinen asıl/üst öğeye (blog) göndermeleri kaldırılmıştırThe tracked dependents/children (posts) now have null FK values and their reference to the deleted principal/parent (blog) has been removed

DeleteBehavior.Restrict gerekli veya isteğe bağlı ilişki ileDeleteBehavior.Restrict with required or optional relationship

  After loading entities:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  After deleting blog '1':
    Blog '1' is in state Deleted with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  Saving changes:
  SaveChanges threw InvalidOperationException: The association between entity types 'Blog' and 'Post' has been severed but the foreign key for this relationship cannot be set to null. If the dependent entity should be deleted, then setup the relationship to use cascade deletes.
  • Blog Silinmiş olarak işaretlenirBlog is marked as Deleted
  • Basamaklı kaydetmeler SaveChanges kadar gerçekleşmediğinden gönderiler başlangıçta değişmeden kalırPosts initially remain Unchanged since cascades do not happen until SaveChanges
  • Kısıtlama, EF'ye FK'yı otomatik olarak null olarak ayarlamamasını söylediğinden, geçersiz kalır ve SaveChanges kaydetmeden atarSince Restrict tells EF to not automatically set the FK to null, it remains non-null and SaveChanges throws without saving

Yetim örneklerini silmeDelete orphans examples

Aşağıdaki kod, karşıdan yüklenebilecek ve çalıştırılabilen bir örneğin parçasıdır.The code below is part of a sample that can be downloaded and run. Örnek, bir üst/asıl ve alt/alt öğesi arasındaki ilişki koptuğunda, hem isteğe bağlı hem de gerekli ilişkiler için her silme davranışı için neler olduğunu gösterir.The sample shows what happens for each delete behavior for both optional and required relationships when the relationship between a parent/principal and its children/dependents is severed. Bu örnekte, ilişki, asıl/üst öğedeki (blog) koleksiyon gezinti özelliğinden bağımlı/alt (gönderiler) kaldırılarak kesilir.In this example, the relationship is severed by removing the dependents/children (posts) from the collection navigation property on the principal/parent (blog). Ancak, bağımlı/alttan alt öğeye/üst öğeye yapılan başvuru iptal edilirse davranış aynıdır.However, the behavior is the same if the reference from dependent/child to principal/parent is instead nulled out.

var blog = context.Blogs.Include(b => b.Posts).First();
var posts = blog.Posts.ToList();

DumpEntities("  After loading entities:", context, blog, posts);

blog.Posts.Clear();

DumpEntities("  After making posts orphans:", context, blog, posts);

try
{
    Console.WriteLine();
    Console.WriteLine("  Saving changes:");

    context.SaveChanges();

    DumpSql();

    DumpEntities("  After SaveChanges:", context, blog, posts);
}
catch (Exception e)
{
    DumpSql();

    Console.WriteLine();
    Console.WriteLine($"  SaveChanges threw {e.GetType().Name}: {(e is DbUpdateException ? e.InnerException.Message : e.Message)}");
}

Neler olduğunu anlamak için her varyasyonu gözden geçirelim.Let's walk through each variation to understand what is happening.

DeleteBehavior.Cascade gerekli veya isteğe bağlı ilişki ileDeleteBehavior.Cascade with required or optional relationship

  After loading entities:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  After making posts orphans:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Modified with FK '1' and no reference to a blog.
      Post '2' is in state Modified with FK '1' and no reference to a blog.

  Saving changes:
    DELETE FROM [Posts] WHERE [PostId] = 1
    DELETE FROM [Posts] WHERE [PostId] = 2

  After SaveChanges:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Detached with FK '1' and no reference to a blog.
      Post '2' is in state Detached with FK '1' and no reference to a blog.
  • İlişkiyi kesme fk'nın null olarak işaretlenilmesine neden olduğundan gönderiler DeğiştirilmiştirPosts are marked as Modified because severing the relationship caused the FK to be marked as null
    • FK nullable değilse, o zaman gerçek değeri null olarak işaretlenmiş olsa bile değişmezIf the FK is not nullable, then the actual value will not change even though it is marked as null
  • SaveChanges bağımlılar/çocuklar (gönderiler) için silme gönderirSaveChanges sends deletes for dependents/children (posts)
  • Tasarruf tan sonra, bağımlılar/çocuklar (gönderiler) artık veritabanından silindiğinden ayrılırAfter saving, the dependents/children (posts) are detached since they have now been deleted from the database

DeleteBehavior.ClientSetNull veya DeleteBehavior.SetNull gerekli ilişki ileDeleteBehavior.ClientSetNull or DeleteBehavior.SetNull with required relationship

  After loading entities:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  After making posts orphans:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Modified with FK 'null' and no reference to a blog.
      Post '2' is in state Modified with FK 'null' and no reference to a blog.

  Saving changes:
    UPDATE [Posts] SET [BlogId] = NULL WHERE [PostId] = 1

  SaveChanges threw DbUpdateException: Cannot insert the value NULL into column 'BlogId', table 'EFSaving.CascadeDelete.dbo.Posts'; column does not allow nulls. UPDATE fails. The statement has been terminated.
  • İlişkiyi kesme fk'nın null olarak işaretlenilmesine neden olduğundan gönderiler DeğiştirilmiştirPosts are marked as Modified because severing the relationship caused the FK to be marked as null
    • FK nullable değilse, o zaman gerçek değeri null olarak işaretlenmiş olsa bile değişmezIf the FK is not nullable, then the actual value will not change even though it is marked as null
  • SaveChanges, FK gönderisini null'a ayarlamaya çalışır, ancak FK geçersiz olmadığı için bu başarısız olurSaveChanges attempts to set the post FK to null, but this fails because the FK is not nullable

DeleteBehavior.ClientSetNull veya DeleteBehavior.SetNull isteğe bağlı ilişki ileDeleteBehavior.ClientSetNull or DeleteBehavior.SetNull with optional relationship

  After loading entities:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  After making posts orphans:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Modified with FK 'null' and no reference to a blog.
      Post '2' is in state Modified with FK 'null' and no reference to a blog.

  Saving changes:
    UPDATE [Posts] SET [BlogId] = NULL WHERE [PostId] = 1
    UPDATE [Posts] SET [BlogId] = NULL WHERE [PostId] = 2

  After SaveChanges:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK 'null' and no reference to a blog.
      Post '2' is in state Unchanged with FK 'null' and no reference to a blog.
  • İlişkiyi kesme fk'nın null olarak işaretlenilmesine neden olduğundan gönderiler DeğiştirilmiştirPosts are marked as Modified because severing the relationship caused the FK to be marked as null
    • FK nullable değilse, o zaman gerçek değeri null olarak işaretlenmiş olsa bile değişmezIf the FK is not nullable, then the actual value will not change even though it is marked as null
  • SaveChanges, her iki bağımlının/çocuğun (posta) FK'sını null ayarlarSaveChanges sets the FK of both dependents/children (posts) to null
  • Tasarruf tan sonra, bağımlılar/çocuklar (gönderiler) artık null FK değerlerine sahiptir ve silinen asıl/üst öğeye (blog) göndermeleri kaldırılmıştırAfter saving, the dependents/children (posts) now have null FK values and their reference to the deleted principal/parent (blog) has been removed

DeleteBehavior.Restrict gerekli veya isteğe bağlı ilişki ileDeleteBehavior.Restrict with required or optional relationship

  After loading entities:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Unchanged with FK '1' and reference to blog '1'.
      Post '2' is in state Unchanged with FK '1' and reference to blog '1'.

  After making posts orphans:
    Blog '1' is in state Unchanged with 2 posts referenced.
      Post '1' is in state Modified with FK '1' and no reference to a blog.
      Post '2' is in state Modified with FK '1' and no reference to a blog.

  Saving changes:
  SaveChanges threw InvalidOperationException: The association between entity types 'Blog' and 'Post' has been severed but the foreign key for this relationship cannot be set to null. If the dependent entity should be deleted, then setup the relationship to use cascade deletes.
  • İlişkiyi kesme fk'nın null olarak işaretlenilmesine neden olduğundan gönderiler DeğiştirilmiştirPosts are marked as Modified because severing the relationship caused the FK to be marked as null
    • FK nullable değilse, o zaman gerçek değeri null olarak işaretlenmiş olsa bile değişmezIf the FK is not nullable, then the actual value will not change even though it is marked as null
  • Kısıtlama, EF'ye FK'yı otomatik olarak null olarak ayarlamamasını söylediğinden, geçersiz kalır ve SaveChanges kaydetmeden atarSince Restrict tells EF to not automatically set the FK to null, it remains non-null and SaveChanges throws without saving

İzlenmemiş varlıklara basamaklamaCascading to untracked entities

SaveChanges'ıaradiğinizde, basamaklı silme kuralları bağlam tarafından izlenen tüm varlıklara uygulanır.When you call SaveChanges, the cascade delete rules will be applied to any entities that are being tracked by the context. Bu, yukarıda gösterilen tüm örneklerdeki durumdur, bu nedenle SQL hem asıl/üst (blog) hem de tüm bağımlıları/alt ları (gönderileri) silmek için oluşturulmuştur:This is the situation in all the examples shown above, which is why SQL was generated to delete both the principal/parent (blog) and all the dependents/children (posts):

    DELETE FROM [Posts] WHERE [PostId] = 1
    DELETE FROM [Posts] WHERE [PostId] = 2
    DELETE FROM [Blogs] WHERE [BlogId] = 1

Yalnızca anapara yüklenirse (örneğin, gönderileri eklemeden Include(b => b.Posts) bir blog için sorgu yapılırsa- SaveChanges yalnızca asıl/üst öğeyi silmek için SQL oluşturur:If only the principal is loaded--for example, when a query is made for a blog without an Include(b => b.Posts) to also include posts--then SaveChanges will only generate SQL to delete the principal/parent:

    DELETE FROM [Blogs] WHERE [BlogId] = 1

Bağımlılar/alt (gönderiler) yalnızca veritabanında ilgili basamaklı davranış yapılandırılırsa silinir.The dependents/children (posts) will only be deleted if the database has a corresponding cascade behavior configured. Veritabanını oluşturmak için EF kullanırsanız, bu basamaklı davranış sizin için kurulum olacaktır.If you use EF to create the database, this cascade behavior will be setup for you.