Basamaklı Silme

Entity Framework Core (EF Core), yabancı anahtar kullanan ilişkileri temsil eder. Yabancı anahtara sahip bir varlık, ilişkide alt veya bağımlı varlıktır. Bu varlığın yabancı anahtar değeri, ilgili asıl/üst varlığın birincil anahtar değeriyle (veya alternatif bir anahtar değeriyle) eşleşmeli.

Asıl/üst varlık silinirse bağımlı/alt öğenin yabancı anahtar değerleri artık herhangi bir sorumlu/üst öğenin birincil veya alternatif anahtarıyla eşleşmez. Bu geçersiz bir durumdur ve çoğu veritabanında bilgi kısıtlama ihlaline neden olur.

Bu bilgi tutarlılığı ihlalini önlemek için iki seçenek vardır:

  1. FK değerlerini null olarak ayarlayın
  2. Bağımlı/alt varlıkları da silin

İlk seçenek yalnızca yabancı anahtar özelliğinin (ve eşlenmiş olduğu veritabanı sütununu) null değere döndürebilir olması gereken isteğe bağlı ilişkiler için geçerlidir.

İkinci seçenek her tür ilişki için geçerlidir ve "basamaklı silme" olarak bilinir.

İpucu

Bu belgede veritabanını güncelleştirme perspektifinden basamaklı silmeler (ve yalnızları silme) açıkmaktadır. EF Core ve Changing Foreign Keys and Navigations Değişiklik İzleme kavramlarını yoğun olarak kullanır. Burada malzemeyi hazır hale gelmeden önce bu kavramları tam olarak anlamadan emin olun.

İpucu

örnek kodu dosyadan indirerek bu belgenin tüm kodlarında çalıştırabilir ve hata GitHub.

Basamaklı davranışlar meydana geldiğinde

Bağımlı/alt varlık artık geçerli sorumlu/üst öğesiyle ilişkilendirilene kadar basamaklı silmeler gerekir. Bunun nedeni sorumlu/üst öğenin silinmesi veya sorumlu/üst öğenin hala mevcut olması ama bağımlı/alt öğenin artık ilişkili olmadığı durumların olması olabilir.

Sorumlu/üst öğe silme

bağımlı/alt öğe Blog olan ile bir ilişkide sorumlu/üst olan bu basit modeli Post düşünün. Post.BlogId , değerinin gönderinin ait olduğu blogun birincil Blog.Id anahtarıyla eşleşmesi gereken yabancı anahtar özelliğidir.

public class Blog
{
    public int Id { get; set; }

    public string Name { get; set; }

    public IList<Post> Posts { get; } = new List<Post>();
}

public class Post
{
    public int Id { get; set; }

    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

Kural gereği, yabancı anahtar özelliği null değerdilemez olduğu için Post.BlogId bu ilişki gerekli olarak yapılandırılır. Gerekli ilişkiler varsayılan olarak basamaklı silmeleri kullanmak üzere yapılandırılır. İlişkileri modelleme hakkında daha fazla bilgi için bkz. İlişkiler.

Bir blog silinirken tüm gönderiler basamaklı olarak silinir. Örnek:

using var context = new BlogsContext();

var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();

context.Remove(blog);

context.SaveChanges();

SaveChanges, örnek olarak SQL kullanarak SQL Server aşağıdaki adımları üretir:

-- Executed DbCommand (1ms) [Parameters=[@p0='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;

-- Executed DbCommand (0ms) [Parameters=[@p0='2'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;

-- Executed DbCommand (2ms) [Parameters=[@p1='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Blogs]
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;

İlişkiyi keserek

Bunun yerine, blogu silmek yerine her gönderi ile blogu arasındaki ilişkiyi kesebiliriz. Bu, başvuru gezintisi her gönderi için Post.Blog null olarak ayarlanarak yapılabilir:

using var context = new BlogsContext();

var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();

foreach (var post in blog.Posts)
{
    post.Blog = null;
}

context.SaveChanges();

İlişki, koleksiyon gezinti bölmesinden her gönderi kaldırılarak da Blog.Posts kesebilir:

using var context = new BlogsContext();

var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();

blog.Posts.Clear();

context.SaveChanges();

Her iki durumda da sonuç aynıdır: blog silinmez, ancak artık herhangi bir blogla ilişkilendirilen gönderiler silinir:

-- Executed DbCommand (1ms) [Parameters=[@p0='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;

-- Executed DbCommand (0ms) [Parameters=[@p0='2'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Posts]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;

Artık sorumluyla/bağımlıyla ilişkilendirilen varlıkları silme işlemi "yalnızları silme" olarak bilinir.

İpucu

Öksüzleri basamakla silme ve silme işlemi yakından ilişkili. Her ikisi de, gerekli sorumlu/üst öğeyle ilişki kesilerek bağımlı/alt varlıkların silinmesine neden olur. Basamaklı silme için bu silme, sorumlu/üst öğenin kendisi silindiğinde gerçekleşir. Yalnızlar için sorumlu/üst varlık hala mevcuttur, ancak artık bağımlı/alt varlıklarla ilgili değildir.

Basamaklı davranışlar nerede olur?

Basamaklı davranışlar şulara uygulanabilir:

İzli varlıkların basamaklı silme

EF Core yapılandırılmış basamaklı davranışları her zaman izilen varlıklara uygular. Bu, uygulamanın tüm ilgili bağımlı/alt varlıkları yukarıdaki örneklerde gösterildiği gibi DbContext'e yüklemesi, veritabanının nasıl yapılandırıldığından bağımsız olarak basamaklı davranışların doğru şekilde uygulanacak olduğu anlamına gelir.

İpucu

İzilen varlıklarda basamaklı davranışların ne zaman meydana geldiğinde tam zamanlaması ChangeTracker.CascadeDeleteTiming ve ChangeTracker.DeleteOrphansTiming kullanılarak denetlenilebilir. Daha fazla bilgi için bkz. Yabancı Anahtarları ve Gezintileri Değiştirme.

Veritabanında basamaklı silme

Birçok veritabanı sistemi, veritabanında bir varlık silindiğinde tetiklenen basamaklı davranışlar da sunar. EF Core, EnsureCreated veya EF Core kullanılarak bir veritabanı oluşturulduğunda bu davranışları EF Core modelde basamaklı silme davranışına EF Core yapılandırıyor. Örneğin yukarıdaki model kullanılarak aşağıdaki tablo, aşağıdaki tablo, aşağıdaki tablo kullanılarak gönderiler SQL Server:

CREATE TABLE [Posts] (
    [Id] int NOT NULL IDENTITY,
    [Title] nvarchar(max) NULL,
    [Content] nvarchar(max) NULL,
    [BlogId] int NOT NULL,
    CONSTRAINT [PK_Posts] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Posts_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([Id]) ON DELETE CASCADE
);

Bloglar ve gönderiler arasındaki ilişkiyi tanımlayan yabancı anahtar kısıtlaması ile yapılandırıldı. ON DELETE CASCADE

Veritabanının bu şekilde yapılandırıldığından emin olmak için ilk olarak gönderileri yüklemeden bir blogu silebilirsiniz. Bu durumda veritabanı, ilgili blogla ilgili tüm gönderileri siler. Örnek:

using var context = new BlogsContext();

var blog = context.Blogs.OrderBy(e => e.Name).First();

context.Remove(blog);

context.SaveChanges();

Gönderiler için bir Include şey olmadığını, dolayısıyla yüklenmemiş olduğunu fark edin. Bu durumda SaveChanges yalnızca blogu silebilir çünkü takipte olan tek varlık budur:

-- Executed DbCommand (6ms) [Parameters=[@p0='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Blogs]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;

Veritabanındaki yabancı anahtar kısıtlaması basamaklı silmeler için yapılandırılmamışsa bu bir özel durumla sonuçlandır. Ancak bu durumda gönderiler veritabanı tarafından silinir çünkü gönderiler oluşturulduğunda ON DELETE CASCADE ile yapılandırılmıştır.

Not

Veritabanları genellikle yalnız kalanları otomatik olarak silmenin bir yolu değildir. Bunun nedeni, EF Core ve yabancı anahtar kullanan ilişkileri temsil ederken veritabanlarının yalnızca yabancı anahtarlara sahip ve hiç gezintisi yoktur. Bu, her iki tarafı da DbContext'e yüklemeden bir ilişkiyi genellikle kesmenin mümkün olmadığını ifade ediyor.

Not

Bellek EF Core veritabanı şu anda veritabanında basamaklı silmeleri desteklemez.

Uyarı

Varlıkları geçici olarak silerken veritabanında basamaklı silmeyi yapılandırmazsanız. Bu, varlıkların otomatik olarak silinmek yerine yanlışlıkla silinmesine neden olabilir.

Veritabanı basamaklı sınırlamaları

En çok SQL Server veritabanlarının döngüleri formlayan basamaklı davranışlar üzerinde sınırlamaları vardır. Örneğin, aşağıdaki modeli düşünün:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }

    public IList<Post> Posts { get; } = new List<Post>();

    public int OwnerId { get; set; }
    public Person Owner { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }

    public int AuthorId { get; set; }
    public Person Author { get; set; }
}

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    public IList<Post> Posts { get; } = new List<Post>();

    public Blog OwnedBlog { get; set; }
}

Bu modelin üç ilişkisi vardır; bunların hepsi zorunludur ve bu nedenle kurala göre silmeyi basamaklı olarak yapılandırmış olur:

  • Bir blog silindi, ilgili tüm gönderiler basamaklı olarak silinecek
  • Gönderilerin yazarının silinmesi, yazıların basamaklı olarak silinmesine neden olur
  • Bir blog sahibinin silinmesi, blogun basamaklı olarak silinmesine neden olur

Bunların hepsi makuldür (blog yönetimi ilkelerde birazdraconian varsa!) ancak bu basamaklı SQL Server bir veritabanı oluşturma girişimi aşağıdaki özel durumla sonuç verir:

Microsoft.Data.SqlClient.SqlException (0x80131904): 'Gönderiler' tablosunda 'FK_Posts_Person_AuthorId' YABANCı ANAHTAR kısıtlaması kullanıma açmak döngülere veya birden çok basamaklı yola neden olabilir. EYLEM SİLE YA DA EYLEM YOK GÜNCELLE'de belirtin veya diğer YABANCı ANAHTAR kısıtlamalarını değiştirebilirsiniz.

Bu durumu işlemenin iki yolu vardır:

  1. İlişkilerin bir veya daha fazlasını silmeyi basamaklama olarak değiştirme.
  2. Veritabanını bu basamaklı silmelerden biri veya daha fazlası olmadan yapılandırarak tüm bağımlı varlıkların yüklendiğinden emin olun, böylece EF Core gerçekleştirebilirsiniz.

Örneğimizde ilk yaklaşımı ele alarak, boş değer atılabilir bir yabancı anahtar özelliği vererek blog sahibi ilişkisini isteğe bağlı hale değiştirilebiliriz:

public int? BlogId { get; set; }

İsteğe bağlı bir ilişki, blogda sahip olmadan varolma özelliğine olanak sağlar. Başka bir ifadeyle basamaklı silme artık varsayılan olarak yapılandırılmaz. Bu, basamaklı eylemlerde artık bir döngü olmadığı ve veritabanının hataya neden olmadan oluşturula SQL Server.

Bunun yerine ikinci yaklaşımı benimserek blog sahibi ilişkisinin gerekli ve basamaklı silme için yapılandırılmasını silebiliriz ancak bu yapılandırmanın veritabanı için değil yalnızca izilen varlıklar için geçerli olması gerekir:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Blog>()
        .HasOne(e => e.Owner)
        .WithOne(e => e.OwnedBlog)
        .OnDelete(DeleteBehavior.ClientCascade);
}

Şimdi hem bir kişiyi hem de sahibi olduğu blogu yükleyemedik ve kişiyi silecek oluruz.

using var context = new BlogsContext();

var owner = context.People.Single(e => e.Name == "ajcvickers");
var blog = context.Blogs.Single(e => e.Owner == owner);

context.Remove(owner);

context.SaveChanges();

EF Core, sahibin silinmesini basamaklı olarak sıralar, böylece blog da silinir:

-- Executed DbCommand (8ms) [Parameters=[@p0='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Blogs]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;

-- Executed DbCommand (2ms) [Parameters=[@p1='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [People]
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;

Ancak, sahibi silindiğinde blog yüklenmezse:

using var context = new BlogsContext();

var owner = context.People.Single(e => e.Name == "ajcvickers");

context.Remove(owner);

context.SaveChanges();

Ardından veritabanında yabancı anahtar kısıtlaması ihlal edilmesi nedeniyle bir özel durum oluştu:

Microsoft.Data.SqlClient.SqlException: DELETE deyimi "FK_Blogs_People_OwnerId" REFERENCE kısıtlaması ile çakıştı. Çakışma " dbo" tablosu olan "Scratch" veritabanında oluştu. Bloglar", 'OwnerId' sütunu. deyimi sonlandırıldı.

Basamaklı null değerler

İsteğe bağlı ilişkiler, null değere değiştirilebilir veritabanı sütunlarıyla eşlenmiş boş değere sahip yabancı anahtar özelliklerine sahiptir. Bu, geçerli sorumlu/üst silindiğinde veya bağımlı/alt öğeden kesili olduğunda yabancı anahtar değerinin null olarak ayarlandırılay olduğu anlamına gelir.

Basamaklı davranışlar meydana geldiğinde, ancak bu kez null değer atılabilir yabancı anahtar özelliğiyle temsil edilen isteğe bağlı bir ilişki ile ilgili örneklere yeniden bakalım:

public int? BlogId { get; set; }

İlgili blog silindiğinde bu yabancı anahtar özelliği her gönderi için null olarak ayarlanır. Örneğin, öncekiyle aynı olan bu kod:

using var context = new BlogsContext();

var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();

context.Remove(blog);

context.SaveChanges();

Artık SaveChanges çağrıldı olduğunda aşağıdaki veritabanı güncelleştirmeleri ile sonuçlandıracak:

-- Executed DbCommand (2ms) [Parameters=[@p1='1', @p0=NULL (DbType = Int32)], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
UPDATE [Posts] SET [BlogId] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;

-- Executed DbCommand (0ms) [Parameters=[@p1='2', @p0=NULL (DbType = Int32)], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
UPDATE [Posts] SET [BlogId] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;

-- Executed DbCommand (1ms) [Parameters=[@p2='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Blogs]
WHERE [Id] = @p2;
SELECT @@ROWCOUNT;

Benzer şekilde, ilişki yukarıdaki örneklerden biri kullanılarak kesili ise:

using var context = new BlogsContext();

var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();

foreach (var post in blog.Posts)
{
    post.Blog = null;
}

context.SaveChanges();

Veya:

using var context = new BlogsContext();

var blog = context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).First();

blog.Posts.Clear();

context.SaveChanges();

Ardından SaveChanges çağrıldıkça gönderiler null yabancı anahtar değerleriyle güncelleştirilir:

-- Executed DbCommand (2ms) [Parameters=[@p1='1', @p0=NULL (DbType = Int32)], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
UPDATE [Posts] SET [BlogId] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;

-- Executed DbCommand (0ms) [Parameters=[@p1='2', @p0=NULL (DbType = Int32)], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
UPDATE [Posts] SET [BlogId] = @p0
WHERE [Id] = @p1;
SELECT @@ROWCOUNT;

Değerleri değiştirildiklerinde yabancı anahtarları ve gezintileri nasıl EF Core hakkında daha fazla bilgi için bkz. Yabancı Anahtarları ve Gezintileri Değiştirme.

Not

Bu gibi ilişkilerin düzeltmesi, 2008'in ilk sürümünden bu yana Entity Framework davranışıdır. Bu EF Core önce bir adı değildi ve değiştirmek mümkün değildi. Artık sonraki bölümde ClientSetNull açıklandığı gibi bilinir.

veritabanları, isteğe bağlı bir ilişkide bir sorumlu/üst öğe silindiğinde null değerleri bu şekilde basamaklandırarak yalıtabilirsiniz. Ancak bu, veritabanında basamaklı silmeler kullanmaya göre çok daha az yaygındır. Veritabanındaki silmeleri ve basamaklı null değerlerin aynı anda basamaklı olarak kullanımı, veritabanı silme ve basamaklama kullanılırken neredeyse her zaman ilişki döngüleri SQL Server. Basamaklı null değerleri yapılandırma hakkında daha fazla bilgi için sonraki bölüme bakın.

Basamaklı davranışları yapılandırma

İpucu

Buraya gelmeden önce yukarıdaki bölümleri okuduğundan emin olun. Önceki malzeme anlaşılmazsa yapılandırma seçenekleri muhtemelen anlamlı olmaz.

Basamaklı davranışlar, OnModelCreatingiçinde OnDelete yöntemi kullanılarak ilişki başına yapılandırılır. Örnek:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Blog>()
        .HasOne(e => e.Owner)
        .WithOne(e => e.OwnedBlog)
        .OnDelete(DeleteBehavior.ClientCascade);
}

Varlık türleri arasındaki ilişkileri yapılandırma hakkında daha fazla bilgi için bkz. İlişkiler.

OnDelete , OnDelete enum değerinden bir değer kabul eder. Bu enum, hem EF Core varlıkların davranışını hem de şemayı oluşturmak için EF kullanılırken veritabanında basamaklı silmenin yapılandırmasını tanımlar.

Veritabanı şeması üzerindeki etki

Aşağıdaki tabloda, geçişler veya EnsureCreated tarafından oluşturulan yabancı anahtar OnDelete kısıtlaması EF Core her değerin OnDelete

DeleteBehavior Veritabanı şeması üzerindeki etki
Cascade DELETE CASCADE ÜZERINDE
Kısıtlama DELETE RESTRICT ÜZERINDE
NoAction veritabanı varsayılanı
Setnull ON DELETE SET NULL
ClientSetNull veritabanı varsayılanı
ClientCascade veritabanı varsayılanı
ClientNoAction veritabanı varsayılanı

İlişkisel ON DELETE NO ACTION veritabanlarında ve (veritabanı varsayılanı) ON DELETE RESTRICT davranışları genellikle aynı veya çok benzerdir. Neleri ifade ediyor olabilir, ancak bu seçeneklerin her ikisi de bilgi NO ACTION kısıtlamalarının uygulanmasına neden olur. Aradaki fark, veritabanının kısıtlamaları kontrol etmektir. Veritabanı sisteminiz üzerinde ve arasındaki belirli farklar ON DELETE NO ACTION için ON DELETE RESTRICT veritabanı belgelerinizi kontrol edin.

SQL Server desteklemez, bu ON DELETE RESTRICT nedenle ON DELETE NO ACTION bunun yerine kullanılır.

Veritabanında basamaklı davranışlara neden olacak değerler yalnızca ve CascadeSetNull değerleridir. Diğer tüm değerler veritabanını hiçbir değişikliği basamaklamayacak şekilde yapılandıracak.

SaveChanges davranışı üzerindeki etkisi

Aşağıdaki bölümlerde yer alan tablolar, sorumlu/üst öğe silindiğinde veya bağımlı/alt varlıklarla ilişkisi kesdiğinde bağımlı/alt varlıklara ne olacağını içerir. Her tablo şu tablolardan birini kapsar:

  • İsteğe bağlı (null değere sahip FK) ve gerekli (null değere sahip olmayan FK) ilişkiler
  • Bağımlılar/altlar DbContext tarafından yüklendiğinde ve izleniyorsa ve yalnızca veritabanında mevcut olduğunda

Bağımlılarla/bağımlıların/çocukların yüklü olduğu gerekli ilişki

DeleteBehavior Asıl/üst öğe silinirken Sorumludan/üst öğeden sunuculamada
Cascade Bağımlılar tarafından EF Core Bağımlılar tarafından EF Core
Kısıtlama InvalidOperationException InvalidOperationException
NoAction InvalidOperationException InvalidOperationException
Setnull SqlException veritabanı oluştururken SqlException veritabanı oluştururken
ClientSetNull InvalidOperationException InvalidOperationException
ClientCascade Bağımlılar tarafından EF Core Bağımlılar tarafından EF Core
ClientNoAction DbUpdateException InvalidOperationException

Notlar:

  • Bu gibi gerekli ilişkiler için varsayılan Cascade değerdir.
  • Gerekli ilişkiler için basamaklı silme dışında herhangi bir şey kullanmak SaveChanges çağrıldı olduğunda bir özel durumla sonuçlandır.
    • Genellikle, yüklenen alt EF Core/bağımlılarda geçersiz durum algılandığından bu bir InvalidOperationException kaynaktır.
    • ClientNoAction , EF Core bağımlıları veritabanına göndermeden önce düzeltme bağımlılarını denetlemeye karşı kullanır, bu nedenle bu durumda veritabanı bir özel durum oluşturur ve bu da DbUpdateException SaveChanges tarafından sarmalanmış olur.
    • SetNull veritabanı oluşturulurken reddedilir çünkü yabancı anahtar sütunu null değere sahip değildir.
  • Bağımlılar/çocuklar yüklendiğinden, bunlar her zaman EF Core tarafından silinir ve veritabanının silinmesi için hiçbir zaman silinmez.

Bağımlılarla/bağımlılarla gerekli ilişki yüklenmedi

DeleteBehavior Asıl/üst öğe silinirken Sorumludan/üst öğeden sunuculamada
Cascade Veritabanı tarafından silinen bağımlılar Yok
Kısıtlama DbUpdateException Yok
NoAction DbUpdateException Yok
Setnull SqlException veritabanı oluştururken Yok
ClientSetNull DbUpdateException Yok
ClientCascade DbUpdateException Yok
ClientNoAction DbUpdateException Yok

Notlar:

  • Bağımlılar/alt öğeler yüklenmediği için bir ilişkinin olmaması burada geçerli değildir.
  • Bu gibi gerekli ilişkiler için varsayılan değer budur Cascade .
  • Gerekli ilişkiler için basamaklı silme dışında herhangi bir şeyin kullanılması, SaveChanges çağrıldığında bir özel durum oluşmasına neden olur.
    • Genellikle bu, DbUpdateException bağımlılar/alt öğeler yüklenmediği ve bu nedenle geçersiz durum yalnızca veritabanı tarafından algılanabileceğinden oluşur. Sonra SaveChanges, içindeki veritabanı özel durumunu sarmalanmış DbUpdateException .
    • SetNull yabancı anahtar sütunu boş değer atanabilir olmadığından veritabanı oluşturulurken reddedilir.

Bağımlılar/alt öğeler yüklü olan isteğe bağlı ilişki

DeleteBehavior Asıl/üst öğe silinirken Sorumlu/üst öğeden sonra
Seçilemez EF Core tarafından silinen bağımlılar EF Core tarafından silinen bağımlılar
Kısıtlama Bağımlı FKs 'ler EF Core göre null olarak ayarlandı Bağımlı FKs 'ler EF Core göre null olarak ayarlandı
NoAction Bağımlı FKs 'ler EF Core göre null olarak ayarlandı Bağımlı FKs 'ler EF Core göre null olarak ayarlandı
SetNull Bağımlı FKs 'ler EF Core göre null olarak ayarlandı Bağımlı FKs 'ler EF Core göre null olarak ayarlandı
ClientSetNull Bağımlı FKs 'ler EF Core göre null olarak ayarlandı Bağımlı FKs 'ler EF Core göre null olarak ayarlandı
ClientCascade EF Core tarafından silinen bağımlılar EF Core tarafından silinen bağımlılar
ClientNoAction DbUpdateException Bağımlı FKs 'ler EF Core göre null olarak ayarlandı

Notlar:

  • Bu gibi isteğe bağlı ilişkiler için varsayılan değer budur ClientSetNull .
  • Veya yapılandırılmadığı takdirde bağımlılar/alt öğeler hiçbir CascadeClientCascade şekilde silinmez.
  • Tüm diğer değerler, bağımlı FKs 'ler EF Core tarafından null olarak ayarlanmasına neden olur...
    • ... ClientNoAction bunun dışında, asıl/üst öğe silindiğinde, bağımlıların veya alt öğelerin yabancı anahtarlarına dokunmayacağını EF Core söyler. Bu nedenle veritabanı, SaveChanges tarafından bir özel durum oluşturur DbUpdateException .

Bağımlılar/çocuklarla isteğe bağlı ilişki yüklenmedi

DeleteBehavior Asıl/üst öğe silinirken Sorumlu/üst öğeden sonra
Seçilemez Veritabanı tarafından silinen bağımlılar Yok
Kısıtlama DbUpdateException Yok
NoAction DbUpdateException Yok
SetNull Bağımlı FKs 'ler veritabanına göre null olarak ayarlandı Yok
ClientSetNull DbUpdateException Yok
ClientCascade DbUpdateException Yok
ClientNoAction DbUpdateException Yok

Notlar:

  • Bağımlılar/alt öğeler yüklenmediği için bir ilişkinin olmaması burada geçerli değildir.
  • Bu gibi isteğe bağlı ilişkiler için varsayılan değer budur ClientSetNull .
  • Veritabanı silmeleri veya null değerleri basamakla şekilde yapılandırılmadığı takdirde veritabanı özel durumunun oluşmaması için bağımlılar/alt öğeler yüklenmelidir.