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:
- FK değerlerini null olarak ayarlayın
- 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 Post
bir 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 = await context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).FirstAsync();
context.Remove(blog);
await context.SaveChangesAsync();
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 = await context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).FirstAsync();
foreach (var post in blog.Posts)
{
post.Blog = null;
}
await context.SaveChangesAsync();
İlişki, koleksiyon gezintisinden Blog.Posts
her gönderi kaldırılarak da kesilebilir:
using var context = new BlogsContext();
var blog = await context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).FirstAsync();
blog.Posts.Clear();
await context.SaveChangesAsync();
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 CASCADE
yapı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 = await context.Blogs.OrderBy(e => e.Name).FirstAsync();
context.Remove(blog);
await context.SaveChangesAsync();
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:
- İlişkilerden birini veya birkaçını art arda silme işlemi olmayacak şekilde değiştirin.
- 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 = await context.People.SingleAsync(e => e.Name == "ajcvickers");
var blog = await context.Blogs.SingleAsync(e => e.Owner == owner);
context.Remove(owner);
await context.SaveChangesAsync();
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 = await context.People.SingleAsync(e => e.Name == "ajcvickers");
context.Remove(owner);
await context.SaveChangesAsync();
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 = await context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).FirstAsync();
context.Remove(blog);
await context.SaveChangesAsync();
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 = await context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).FirstAsync();
foreach (var post in blog.Posts)
{
post.Blog = null;
}
await context.SaveChangesAsync();
Veya:
using var context = new BlogsContext();
var blog = await context.Blogs.OrderBy(e => e.Name).Include(e => e.Posts).FirstAsync();
blog.Posts.Clear();
await context.SaveChangesAsync();
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ırDbUpdateException
.SetNull
, yabancı anahtar sütunu null atanamaz olduğundan veritabanı oluşturulurken reddedilir.
- Bu genellikle, yüklenen alt öğelerde/bağımlılarda geçersiz durum algılandığından EF Core'dan gelen bir
- 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çindeDbUpdateException
sarmalar.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üreceCascade
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 birDbUpdateException
özel durum oluşturur.
- ... ancak
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.