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:
- FK değerlerini null olarak ayarlayın
- 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:
- Geçerli DbContext tarafından izlenen varlıklar
- Veritabanındaki bağlama yüklenmemiş varlıklar
İ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:
- İlişkilerin bir veya daha fazlasını silmeyi basamaklama olarak değiştirme.
- 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
Cascadedeğ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
InvalidOperationExceptionkaynaktı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 daDbUpdateExceptionSaveChanges tarafından sarmalanmış olur.SetNullveritabanı oluşturulurken reddedilir çünkü yabancı anahtar sütunu null değere sahip değildir.
- Genellikle, yüklenen alt EF Core/bağımlılarda geçersiz durum algılandığından bu bir
- 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,
DbUpdateExceptionbağı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. SetNullyabancı anahtar sütunu boş değer atanabilir olmadığından veritabanı oluşturulurken reddedilir.
- Genellikle bu,
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...
- ...
ClientNoActionbunun 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ştururDbUpdateException.
- ...
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.