Aracılığıyla paylaş


Basamaklı Silme

Entity Framework Core (EF Core), yabancı anahtarları kullanan ilişkileri temsil eder. Yabancı anahtara sahip bir varlık, ilişkideki 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 anahtar değeriyle) eşleşmelidir.

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

Bu bilgi kısıtlaması ihlalini önlemek için iki seçenek vardır:

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

İlk seçenek yalnızca yabancı anahtar özelliğinin (ve eşlendiği veritabanı sütununun) null atanabilir 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 "art arda silme" olarak bilinir.

İpucu

Bu belgede, veritabanını güncelleştirme açısından art arda silme işlemleri (ve artıkları silme) açıklanmaktadır. EF Core'da Değişiklik İzleme tanıtılan kavramları ve Yabancı Tuşlar ile Gezintileri Değiştirme'yi yoğun bir şekilde kullanır. Buradaki malzemeleri ele almadan önce bu kavramları tam olarak anladığınızdan emin olun.

İpucu

GitHub’dan örnek kodu indirerek bu belgedeki tüm kodları çalıştırabilir ve hataları ayıklayabilirsiniz.

Basamaklı davranışlar gerçekleştiğinde

Bağımlı/alt varlık artık geçerli sorumlusu/üst öğesiyle ilişkilendirilemediğinde art arda silme işlemleri gerekir. Bunun nedeni, sorumlu/üst öğe silindiği veya asıl/üst öğe hala mevcut olmasına rağmen bağımlı/alt öğe artık ilişkili olmadığında gerçekleşebilir.

Sorumlu/üst öğe silme

bağımlı/alt öğe olan ile Postbir ilişkide asıl/üst öğe olan bu basit modeli Blog düşünün. Post.BlogId , değeri gönderinin ait olduğu blogun Blog.Id birincil 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 atanamaz olduğundan Post.BlogId bu ilişki gerekli olarak yapılandırılır. Gerekli ilişkiler varsayılan olarak art arda silmeleri kullanacak şekilde yapılandırılır. İlişkileri modelleme hakkında daha fazla bilgi için bkz. İlişkiler.

Blog silinirken tüm gönderiler art arda silinir. Örneğin:

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 Server kullanarak aşağıdaki SQL'i oluşturur:

-- 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 kesme

Blogu silmek yerine, her gönderi ile blogu arasındaki ilişkiyi kesebiliriz. Bu, her gönderi için başvuru gezintisi 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 gezintisinden Blog.Posts her gönderi kaldırılarak da kesilebilir:

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şkili olmayan 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 hiçbir sorumluyla/bağımlıyla ilişkili olmayan varlıkların silinmesi "yalnız bırakılmışları silme" olarak bilinir.

İpucu

Artıkları art arda silme ve silme işlemleri yakından ilişkilidir. Her ikisi de gerekli sorumlu/üst öğeyle ilişki kesildiğinde bağımlı/alt varlıkların silinmesiyle sonuçlanır. Art arda silme için bu kesme işlemi, asıl/üst öğe silindiği için gerçekleşir. Yalnız bırakılmışlar için, asıl/üst varlık hala var, ancak artık bağımlı/alt varlıklarla ilişkili değil.

Basamaklı davranışların gerçekleştiği yer

Basamaklı davranışlar şu değerlere uygulanabilir:

  • Geçerli tarafından izlenen varlıklar DbContext
  • Veritabanındaki bağlama yüklenmemiş varlıklar

İzlenen varlıkları art arda silme

EF Core, izlenen varlıklara her zaman yapılandırılmış basamaklı davranışlar uygular. Bu, uygulama yukarıdaki örneklerde gösterildiği gibi tüm ilgili bağımlı/alt varlıkları DbContext'e yüklerse, veritabanının nasıl yapılandırıldığına bakılmaksızın basamaklı davranışların doğru şekilde uygulanacağı anlamına gelir.

İpucu

İzlenen varlıklara basamaklı davranışların ne zaman gerçekleştiğinin tam zamanlaması ve ChangeTracker.DeleteOrphansTimingkullanılarak ChangeTracker.CascadeDeleteTiming denetlenebilir. Daha fazla bilgi için bkz . Yabancı Anahtarları ve Gezintileri Değiştirme.

Veritabanında art arda silme

Birçok veritabanı sistemi, veritabanında bir varlık silindiğinde tetiklenen basamaklı davranışlar da sunar. EF Core, veya EF Core geçişleri kullanılarak EnsureCreated bir veritabanı oluşturulduğunda EF Core modelindeki art arda silme davranışına göre bu davranışları yapılandırmaktadır. Örneğin, yukarıdaki model kullanılarak, SQL Server kullanılırken gönderiler için aşağıdaki tablo oluşturulur:

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ının ile ON DELETE CASCADEyapılandırıldığına dikkat edin.

Veritabanının bu şekilde yapılandırıldığını biliyorsak, önce gönderileri yüklemeden bir blogu silebiliriz ve veritabanı bu blogla ilgili tüm gönderileri silme işlemini üstlenir. Örneğin:

using var context = new BlogsContext();

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

context.Remove(blog);

context.SaveChanges();

Gönderilerin yüklü Include olmadığına dikkat edin. Bu durumda SaveChanges yalnızca blogu siler çünkü izlenen 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ı art arda silme işlemleri için yapılandırılmamışsa bu bir özel durumla sonuçlanır. Ancak bu durumda, gönderiler oluşturulduğu sırada ile ON DELETE CASCADE yapılandırıldığından veritabanı tarafından silinir.

Not

Veritabanları genellikle yalnız bırakılmışları otomatik olarak silmek için herhangi bir yönteme sahip değildir. Bunun nedeni, EF Core'un hem gezintileri hem de yabancı anahtarları kullanan ilişkileri temsil ederken veritabanlarında yalnızca yabancı anahtarlar olması ve gezinti olmamasıdır. Bu, her iki tarafı da DbContext'e yüklemeden bir ilişkinin kesilmesinin genellikle mümkün olmadığı anlamına gelir.

Not

EF Core bellek içi veritabanı şu anda veritabanında art arda silmeleri desteklemiyor.

Uyarı

Varlıkları geçici olarak silerken veritabanında art arda silmeyi yapılandırmayın. Bu, varlıkların geçici olarak silinmek yerine yanlışlıkla silinmesine neden olabilir.

Veritabanı art arda sınırlamaları

Özellikle SQL Server olmak üzere bazı veritabanlarının döngüleri oluşturan art arda davranışlarıyla ilgili sınırlamaları vardır. Örneğin, aşağıdaki modeli göz önünde bulundurun:

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 ve bu nedenle tümü gereklidir ve bu nedenle kurala göre art arda silmek üzere yapılandırılmıştır:

  • Blog silindiğinde ilgili tüm gönderiler art arda silinir
  • Gönderilerin yazarının silinmesi, yazılan gönderilerin art arda silinmesine neden olur
  • Blog sahibinin silinmesi, blogun art arda silinmesine neden olur

Bunların tümü makuldür (blog yönetimi ilkelerinde biraz draconian varsa!) ancak bu basamaklılar yapılandırılmış bir SQL Server veritabanı oluşturmaya çalışmak aşağıdaki özel durumla sonuçlanır:

Microsoft.Data.SqlClient.SqlException (0x80131904): 'Postlar' tablosunda 'FK_Posts_Person_AuthorId' FOREIGN KEY kısıtlamasına giriş, döngülere veya birden çok basamaklı yola neden olabilir. ON DELETE NO ACTION veya ON UPDATE NO ACTION belirtin ya da diğer YABANCı ANAHTAR kısıtlamalarını değiştirin.

Bu durumu ele almanın iki yolu vardır:

  1. İlişkilerden birini veya birkaçını art arda silme işlemi olmayacak şekilde değiştirin.
  2. Veritabanını bu art arda silme işlemlerinden biri veya daha fazlası olmadan yapılandırın, ardından EF Core'un basamaklı davranışı gerçekleştirebilmesi için tüm bağımlı varlıkların yüklendiğinden emin olun.

Örneğimizle ilk yaklaşımı benimseyerek blog sonrası ilişkiyi null atanabilir bir yabancı anahtar özelliği vererek isteğe bağlı hale getirebiliriz:

public int? BlogId { get; set; }

İsteğe bağlı bir ilişki, gönderinin blog olmadan var olmasına olanak tanır ve bu da art arda silme işleminin varsayılan olarak yapılandırılmayacağı anlamına gelir. Bu, artık basamaklı eylemlerde bir döngü olmadığı ve veritabanının SQL Server'da hatasız oluşturulabileceği anlamına gelir.

Bunun yerine ikinci yaklaşımı benimsediğimizde, blog sahibi ilişkisinin gerekli olmasını ve art arda silme için yapılandırılmasını sağlayabiliriz, ancak bu yapılandırmanın veritabanı için değil yalnızca izlenen varlıklar için geçerli olmasını sağlayabiliriz:

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 sahip olduğu blogu yüklersek ve ardından kişiyi silersek ne olur?

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, blogun da silinmesi için sahibin silinmesini art arda siler:

-- 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, sahip 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ındaki yabancı anahtar kısıtlamasının ihlali nedeniyle bir özel durum oluşturulur:

Microsoft.Data.SqlClient.SqlException: DELETE deyimi "FK_Blogs_Kişiler_OwnerId" REFERENCE kısıtlamasıyla çakıştı. Çakışma "Scratch" adlı "dbo" tablosunda oluştu. Bloglar", 'OwnerId' sütunu. Deyim sonlandırıldı.

Basamaklı null'lar

İsteğe bağlı ilişkiler null atanabilir veritabanı sütunlarına eşlenebilir yabancı anahtar özelliklerine sahiptir. Bu, geçerli sorumlu/üst öğe silindiğinde veya bağımlı/alt öğeden kesildiğinde yabancı anahtar değerinin null olarak ayarlanabileceği anlamına gelir.

Basamaklı davranışlar gerçekleştiğinde,ancak bu kez null atanabilir Post.BlogId yabancı anahtar özelliğiyle temsil edilen isteğe bağlı bir ilişki ile ilgili örneklere tekrar göz atalım:

public int? BlogId { get; set; }

bu yabancı anahtar özelliği, ilgili blog silindiğinde 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();

SaveChanges çağrıldığında artık aşağıdaki veritabanı güncelleştirmeleriyle sonuçlanacak:

-- 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, yukarıdaki örneklerden biri kullanılarak ilişki kesilirse:

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ığında 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;

EF Core'un yabancı anahtarları ve gezintileri değerleri değiştikçe nasıl yönettiği hakkında daha fazla bilgi için bkz. Yabancı Anahtarları ve Gezintileri Değiştirme.

Not

Bunun gibi ilişkilerin düzeltilmesi, Entity Framework'ün 2008'deki ilk sürümünden bu yana varsayılan davranışı olmuştur. EF Core'un öncesinde bir adı yoktu ve değiştirilmesi mümkün değildi. Artık bir sonraki bölümde açıklandığı gibi ClientSetNull bilinir.

İsteğe bağlı bir ilişkideki bir sorumlu/üst öğe silindiğinde veritabanları da bunun gibi null değerleri art arda eklemek üzere yapılandırılabilir. Ancak bu, veritabanında art arda silme işlemleri kullanmaktan çok daha az yaygındır. Veritabanında aynı anda art arda silme ve basamaklama null değerlerinin kullanılması, SQL Server kullanılırken neredeyse her zaman ilişki döngülerine neden olur. 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ğunuzdan emin olun. Yukarıdaki malzeme anlaşılmazsa yapılandırma seçenekleri büyük olasılıkla anlamlı olmayacaktır.

art arda davranışlar, içindeki OnModelCreatingyöntemi kullanılarak OnDelete ilişki başına yapılandırılır. Örneğin:

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 , kesinlikle kafa karıştırıcı DeleteBehavior olan sabit listesi'nden bir değer kabul eder. Bu sabit listesi hem izlenen varlıklarda EF Core'un davranışını hem de şemayı oluşturmak için EF kullanıldığında veritabanında art arda silme yapılandırmasını tanımlar.

Veritabanı şeması üzerindeki etkisi

Aşağıdaki tabloda, EF Core geçişleri veya EnsureCreatedtarafından oluşturulan yabancı anahtar kısıtlaması üzerindeki her OnDelete değerin sonucu gösterilmektedir.

DeleteBehavior Veritabanı şeması üzerindeki etkisi
Cascade ART ARDA SILMEDE
Sınırla SILMEDE KıSıTLA
NoAction veritabanı varsayılanı
Setnull SILMEDE KÜME NULL
ClientSetNull veritabanı varsayılanı
ClientCascade veritabanı varsayılanı
ClientNoAction veritabanı varsayılanı

(veritabanı varsayılanı) ve ON DELETE RESTRICT ilişkisel veritabanlarındaki davranışları ON DELETE NO ACTION genellikle aynı veya çok benzerdir. Ne NO ACTION anlama gelebilir, ancak bu seçeneklerin her ikisi de bilgi kısıtlamalarının uygulanmasına neden olur. Aradaki fark, veritabanının kısıtlamaları denetlemesidir. Veritabanı sisteminizdeki ve ON DELETE RESTRICT arasındaki ON DELETE NO ACTION belirli farklar için veritabanı belgelerinize bakın.

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

Veritabanında basamaklı davranışlara neden olacak tek değerler ve SetNull'tirCascade. Diğer tüm değerler, veritabanını herhangi bir değişikliği art arda eklemeyecek şekilde yapılandıracaktır.

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 kesildiğinde bağımlı/alt varlıklara ne olacağını kapsar. Her tablo şunlardan birini kapsar:

  • İsteğe bağlı (null atanabilir FK) ve gerekli (boş değer atanamayan FK) ilişkileri
  • Bağımlılar/alt öğeler DbContext tarafından yüklenip izlendiklerinde ve yalnızca veritabanında mevcut olduklarında

Bağımlılarla/alt öğelerle gerekli ilişki yüklendi

DeleteBehavior Sorumlu/üst öğe silindiğinde Sorumludan/üst öğeden kesmede
Cascade EF Core tarafından silinen bağımlılar EF Core tarafından silinen bağımlılar
Sınırla InvalidOperationException InvalidOperationException
NoAction InvalidOperationException InvalidOperationException
Setnull SqlException veritabanı oluştururken SqlException veritabanı oluştururken
ClientSetNull InvalidOperationException InvalidOperationException
ClientCascade EF Core tarafından silinen bağımlılar EF Core tarafından silinen bağımlılar
ClientNoAction DbUpdateException InvalidOperationException

Notlar:

  • Bunun gibi gerekli ilişkiler için varsayılan değerdir Cascade.
  • Gerekli ilişkiler için art arda silme dışında bir şey kullanılması, SaveChanges çağrıldığında bir özel durumla sonuçlanır.
    • Bu genellikle, yüklenen alt öğelerde/bağımlılarda geçersiz durum algılandığından EF Core'dan gelen bir InvalidOperationException durumdur.
    • ClientNoAction , EF Core'un düzeltme bağımlılarını veritabanına göndermeden önce düzeltme bağımlılarını denetlememeye zorlar, bu nedenle bu durumda veritabanı bir özel durum oluşturur ve ardından SaveChanges tarafından sarmalanır DbUpdateException .
    • SetNull , yabancı anahtar sütunu null atanamaz olduğundan veritabanı oluşturulurken reddedilir.
  • Bağımlılar/alt öğeler yüklendiğinden, bunlar her zaman EF Core tarafından silinir ve veritabanının silinmesi için hiçbir zaman bırakılmaz.

Bağımlılarla/alt öğelerle gerekli ilişki yüklenmedi

DeleteBehavior Sorumlu/üst öğe silindiğinde Sorumludan/üst öğeden kesmede
Cascade Veritabanı tarafından silinen bağımlılar Yok
Sınırla 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ğinden ilişkiyi kesme burada geçerli değildir.
  • Bunun gibi gerekli ilişkiler için varsayılan değerdir Cascade.
  • Gerekli ilişkiler için art arda silme dışında bir şey kullanılması, SaveChanges çağrıldığında bir özel durumla sonuçlanır.
    • DbUpdateException Bunun nedeni genellikle bağımlıların/alt çocukların yüklenmemesidir ve bu nedenle geçersiz durum yalnızca veritabanı tarafından algılanabilir. SaveChanges, veritabanı özel durumunu içinde DbUpdateExceptionsarmalar.
    • SetNull , yabancı anahtar sütunu null atanamaz olduğundan veritabanı oluşturulurken reddedilir.

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

DeleteBehavior Sorumlu/üst öğe silindiğinde Sorumludan/üst öğeden kesmede
Cascade EF Core tarafından silinen bağımlılar EF Core tarafından silinen bağımlılar
Sınırla EF Core tarafından null olarak ayarlanan bağımlı FK'ler EF Core tarafından null olarak ayarlanan bağımlı FK'ler
NoAction EF Core tarafından null olarak ayarlanan bağımlı FK'ler EF Core tarafından null olarak ayarlanan bağımlı FK'ler
Setnull EF Core tarafından null olarak ayarlanan bağımlı FK'ler EF Core tarafından null olarak ayarlanan bağımlı FK'ler
ClientSetNull EF Core tarafından null olarak ayarlanan bağımlı FK'ler EF Core tarafından null olarak ayarlanan bağımlı FK'ler
ClientCascade EF Core tarafından silinen bağımlılar EF Core tarafından silinen bağımlılar
ClientNoAction DbUpdateException EF Core tarafından null olarak ayarlanan bağımlı FK'ler

Notlar:

  • Bunun gibi isteğe bağlı ilişkiler için varsayılan değerdir ClientSetNull.
  • Bağımlılar/alt öğeler, yapılandırılmadığı veya ClientCascade yapılandırılmadığı sürece Cascade hiçbir zaman silinmez.
  • Diğer tüm değerler, ef core tarafından bağımlı FK'lerin null olarak ayarlanmasına neden olur...
    • ... ancak ClientNoAction ef core'a, sorumlu/üst öğe silindiğinde bağımlıların/alt çocukların yabancı anahtarlarına dokunmamalarını söyler. Bu nedenle veritabanı, SaveChanges tarafından sarmalanan bir DbUpdateException özel durum oluşturur.

Bağımlılarla/alt öğeler yüklenmeyen isteğe bağlı ilişki

DeleteBehavior Sorumlu/üst öğe silindiğinde Sorumludan/üst öğeden kesmede
Cascade Veritabanı tarafından silinen bağımlılar Yok
Sınırla DbUpdateException Yok
NoAction DbUpdateException Yok
Setnull Bağımlı FK'ler veritabanına göre null olarak ayarlanmış Yok
ClientSetNull DbUpdateException Yok
ClientCascade DbUpdateException Yok
ClientNoAction DbUpdateException Yok

Notlar:

  • Bağımlılar/alt öğeler yüklenmediğinden ilişkiyi kesme burada geçerli değildir.
  • Bunun gibi isteğe bağlı ilişkiler için varsayılan değerdir ClientSetNull.
  • Veritabanı silmeleri veya null değerleri art arda eklemek üzere yapılandırılmadığı sürece, veritabanı özel durumunu önlemek için bağımlılar/alt öğeler yüklenmelidir.