Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az Entity Framework Core (EF Core) az idegen kulcsokat használó kapcsolatokat jelöli. Az idegen kulccsal rendelkező entitás a kapcsolat gyermek vagy függő entitása. Az entitás idegenkulcs-értékének meg kell egyeznie a kapcsolódó fő/szülő entitás elsődleges kulcsértékével (vagy alternatív kulcsértékével).
Ha a rendszer törli a fő/szülő entitást, akkor a függők/gyermekek idegenkulcs-értékei többé nem egyeznek meg a fő/ szülő elsődleges vagy másodlagos kulcsával. Ez érvénytelen állapot, és hivatkozási kényszer megsértését okozza a legtöbb adatbázisban.
A hivatkozási kényszer megsértésének elkerülésére két lehetőség áll rendelkezésre:
- Az FK értékeinek beállítása null értékre
- A függő/gyermek entitások törlése is
Az első beállítás csak olyan választható kapcsolatokra érvényes, ahol az idegenkulcs-tulajdonságnak (és az adatbázis oszlopának, amelyhez megfeleltetve van) null értékűnek kell lennie.
A második lehetőség bármilyen kapcsolatra érvényes, és "kaszkádolt törlésnek" is nevezik.
Jótanács
Ez a dokumentum az adatbázis frissítése szempontjából a kaszkádolt törléseket (és az árvák törlését) ismerteti. A változáskövetésben az EF Core-ban , valamint az idegen kulcsok és navigációk módosítása során bevezetett fogalmakat nagyban kihasználja. Az itt található anyag kezelése előtt mindenképpen tisztában kell lenni ezekkel a fogalmakkal.
Jótanács
A mintakód GitHubról való letöltésével futtathatja és hibakeresést végezhet a dokumentum összes kódjában.
Kaszkádolt viselkedések esetén
Kaszkádolt törlésre akkor van szükség, amikor egy függő/gyermek entitás már nem társítható az aktuális főentitással/szülővel. Ez azért fordulhat elő, mert a fő/szülő törölve lett, vagy akkor, ha a fő/szülő még létezik, de a függő/gyermek már nem kapcsolódik hozzá.
Főnév/szülő törlése
Fontolja meg ezt az egyszerű modellt, amelyben Blog a fő/szülő egy kapcsolatban van Post-nel, amely a függő/gyermek.
Post.BlogId egy idegenkulcs-tulajdonság, amelynek értéke meg kell egyeznie annak a blognak az Blog.Id elsődleges kulcsával, amelyhez a bejegyzés tartozik.
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; }
}
Konvenció szerint ez a kapcsolat kötelezőként van konfigurálva, mivel az Post.BlogId idegenkulcs-tulajdonság nem null értékű. A szükséges kapcsolatok alapértelmezés szerint kaszkádolt törlés használatára vannak konfigurálva. A kapcsolatok modellezésével kapcsolatos további információkért lásd a Kapcsolatok című témakört.
Blog törlésekor az összes bejegyzés kaszkád módon törlődik. Például:
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();
A SaveChanges a következő SQL-t hozza létre, példaként az SQL Servert használva:
-- 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;
Kapcsolat megszakítása
Ahelyett, hogy törölnénk a blogot, megszüntethetnénk az egyes bejegyzések és a blog közötti kapcsolatot. Ezt úgy teheti meg, hogy a hivatkozási navigációt Post.Blog null értékre állítja az egyes bejegyzésekhez:
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();
A kapcsolat megszakadhat úgy is, hogy eltávolítja az egyes bejegyzéseket a Blog.Posts gyűjtemény navigációs sávjából:
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();
Mindkét esetben az eredmény ugyanaz: a blog nem törlődik, de a bloghoz már nem társított bejegyzések törlődnek:
-- 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;
Az olyan entitások törlése, amelyek már nem tartoznak egyetlen taghoz vagy függőhöz sem, az úgynevezett "árvák törlése".
Jótanács
A kaszkádtörlés és az árvák törlése szorosan összefügg. Mindkettő a függő/gyermek entitások törlését eredményezi, ha az adott esetben szükséges főentitáshoz/szülőhöz való kapcsolat megszakad. Kaszkádolt törlés esetén ez a leválasztás azért történik, mert maga a fő/szülő van törölve. Árvák esetén a fő/szülő entitás továbbra is létezik, de már nem kapcsolódik a függő/gyermek entitásokhoz.
Ahol kaszkádolt viselkedések történnek
A kaszkádolt viselkedések a következőre alkalmazhatók:
- Az aktuális DbContext által nyomon követett entitások
- Az adatbázis azon entitásai, amelyek nincsenek betöltve a munkakörnyezetbe
Nyomon követett entitások kaszkádolt törlése
Az EF Core mindig konfigurált kaszkádolt viselkedéseket alkalmaz a nyomon követett entitásokra. Ez azt jelenti, hogy ha az alkalmazás betölti az összes releváns függő/gyermek entitást a DbContextbe, ahogyan a fenti példákban is látható, akkor a kaszkádolt viselkedések megfelelően lesznek alkalmazva az adatbázis konfigurálásának módjától függetlenül.
Jótanács
A nyomon követett entitások kaszkádolt viselkedésének pontos időzítése szabályozható ChangeTracker.CascadeDeleteTiming az és ChangeTracker.DeleteOrphansTiminga használatával. További információt az Idegen kulcsok és navigációk módosítása című témakörben talál.
Kaszkádos törlés az adatbázisban
Számos adatbázisrendszer kaszkádolt viselkedést is kínál, amelyek akkor aktiválódnak, amikor egy entitást törölnek az adatbázisban. Az EF Core ezeket a viselkedéseket az EF Core-modell kaszkádolt törlési viselkedése alapján konfigurálja, amikor adatbázist hoz létre az EF Core-migrálás vagy az EF Core-áttelepítések használatával EnsureCreated . A fenti modell használatával például a következő táblázat jön létre a bejegyzésekhez az SQL Server használatakor:
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
);
Figyelje meg, hogy a blogok és bejegyzések közötti kapcsolatot meghatározó idegenkulcs-korlátozás a következővel ON DELETE CASCADEvan konfigurálva: .
Ha tudjuk, hogy az adatbázis így van konfigurálva, akkor törölhetünk egy blogot anélkül, hogy először betöltenénk a bejegyzéseket , és az adatbázis gondoskodik a bloghoz kapcsolódó összes bejegyzés törléséről. Például:
using var context = new BlogsContext();
var blog = await context.Blogs.OrderBy(e => e.Name).FirstAsync();
context.Remove(blog);
await context.SaveChangesAsync();
Figyelje meg, hogy a bejegyzésekhez nincs Include címke, így azok nincsenek betöltve. A SaveChanges ebben az esetben csak a blogot törli, mivel ez az egyetlen nyomon követett entitás:
-- Executed DbCommand (6ms) [Parameters=[@p0='1'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
DELETE FROM [Blogs]
WHERE [Id] = @p0;
SELECT @@ROWCOUNT;
Ez kivételt eredményezne, ha az adatbázisban lévő idegenkulcs-korlátozás nincs konfigurálva kaszkádolt törlésekhez. Azonban ebben az esetben az adatbázis törli a bejegyzéseket, mert a létrehozáskor ON DELETE CASCADE-vel lett beállítva.
Megjegyzés:
Az adatbázisokban általában nincs automatikus módszer az árva rekordok törlésére. Ennek az az oka, hogy míg az EF Core a navigációs és az idegen kulcsokat használó kapcsolatokat jelöli, az adatbázisok csak idegen kulcsokkal rendelkeznek, és nincsenek navigációk. Ez azt jelenti, hogy általában nem lehet megszakítani egy kapcsolatot anélkül, hogy mindkét oldalt betöltenek a DbContextbe.
Megjegyzés:
Az EF Core memórián belüli adatbázisa jelenleg nem támogatja a kaszkádolt törléseket az adatbázisban.
Figyelmeztetés
Ne konfigurálja a kaszkádolt törlést az adatbázisban az entitások szoftveres törlésekor. Ez azt eredményezheti, hogy az entitások véletlenül véglegesen törlődnek ahelyett, hogy csak ideiglenesen lennének törölve.
Az adatbázis kaszkád korlátozásai
Egyes adatbázisok, különösen az SQL Server, korlátozásokkal rendelkeznek a ciklusokat alkotó kaszkádolt viselkedésekre. Vegyük például a következő modellt:
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; }
}
Ez a modell három kapcsolattal rendelkezik, mindegyik szükséges, ezért konvenciók szerint kaszkádolt törlésre van konfigurálva:
- A blog törlése kaszkádoltan törli az összes kapcsolódó bejegyzést
- A bejegyzések szerzőjének törlése a bejegyzések automatikus törlését okozza.
- A blog tulajdonosának törlése a blog kaszkádolt törlését eredményezi
Ez ésszerűnek tűnik (még ha kissé drákóinak is a blogkezelési szabályok szempontjából!), de ezeknek a kaszkádoknak a konfigurálásával egy SQL Server-adatbázis létrehozása a következő kivételt eredményezi:
Microsoft.Data.SqlClient.SqlException (0x80131904): A "Post" táblában a "FK_Posts_Person_AuthorId" IDEGENKULCS-kényszer bevezetése ciklusokat vagy több kaszkádolt útvonalat okozhat. Adja meg a "TÖRLÉSKOR NINCS MŰVELET" vagy a "FRISSÍTÉSKOR NINCS MŰVELET" lehetőséget, vagy módosítsa az egyéb IDEGEN KULCS korlátozásokat.
Ezt a helyzetet kétféleképpen lehet kezelni.
- Módosítsa egy vagy több kapcsolatát úgy, hogy ne legyen kaszkádolt törlés.
- Konfigurálja az adatbázist egy vagy több kaszkádolt törlés nélkül, majd győződjön meg arról, hogy az összes függő entitás betöltődik, hogy az EF Core végrehajthassa a kaszkádolt viselkedést.
A példánk első megközelítését figyelembe véve a blog utáni kapcsolatot opcionálissá tehetjük úgy, hogy null értékű idegenkulcs-tulajdonságot adunk neki:
public int? BlogId { get; set; }
Az opcionális kapcsolat lehetővé teszi, hogy a bejegyzés blog nélkül létezhessen, ami azt jelenti, hogy a kaszkádolt törlés alapértelmezés szerint nem lesz konfigurálva. Ez azt jelenti, hogy már nincs ciklus a kaszkádolt műveletekben, és az adatbázis hiba nélkül hozható létre az SQL Serveren.
A második megközelítés helyett megtarthatjuk a blogtulajdonosi kapcsolatot, és konfigurálhatjuk a kaszkádolt törléshez, de ezt a konfigurációt csak a nyomon követett entitásokra, nem pedig az adatbázisra alkalmazhatjuk:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Blog>()
.HasOne(e => e.Owner)
.WithOne(e => e.OwnedBlog)
.OnDelete(DeleteBehavior.ClientCascade);
}
Mi történik most, ha betöltünk egy személyt és a birtokában lévő blogot is, majd töröljük a személyt?
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();
Az EF Core végrehajtja a tulajdonos kaszkádos törlését, ezért a blog is törlődik.
-- 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;
Ha azonban a blog nincs betöltve a tulajdonos törlésekor:
using var context = new BlogsContext();
var owner = await context.People.SingleAsync(e => e.Name == "ajcvickers");
context.Remove(owner);
await context.SaveChangesAsync();
A rendszer kivételt fog kivenni az adatbázis idegenkulcs-korlátozásának megsértése miatt:
Microsoft.Data.SqlClient.SqlException: A DELETE utasítás ütközött a "FK_Blogs_People_OwnerId" hivatkozási kényszersel. Az konfliktus az "Scratch" adatbázis "dbo.Blogs" táblájában, az 'OwnerId' oszlopban történt. Az utasítás megszakadt.
Kaszkádolt nullértékek
A választható kapcsolatok null értékű külső kulcstulajdonságokkal rendelkeznek, amelyek null értékű adatbázisoszlopokra vannak leképezve. Ez azt jelenti, hogy az idegen kulcs értéke null értékű lehet, ha az aktuális fő/szülő törlődik, vagy a függőtől/gyermektől lesz elválasztva.
Tekintsük meg újra a példákat a When cascading behaviors happen című részben, de ezúttal egy null értékűvé tehető Post.BlogId idegenkulcs-tulajdonság által képviselt opcionális kapcsolattal:
public int? BlogId { get; set; }
Ez az idegenkulcs-tulajdonság minden bejegyzéshez null értékű lesz, amikor a kapcsolódó blogot törlik. Ez a kód például ugyanaz, mint korábban:
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();
A SaveChanges meghívásakor a következő adatbázis-frissítések jelennek meg:
-- 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;
Hasonlóképpen, ha a kapcsolat megszakad a fenti példák valamelyikével:
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();
Vagy:
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();
Ezután a rendszer null értékű külső kulcsértékekkel frissíti a bejegyzéseket a SaveChanges meghívásakor:
-- 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;
Az idegen kulcsok és navigációk módosítása című témakörben további információt talál arról, hogy az EF Core hogyan kezeli az idegen kulcsokat és navigációkat az értékük módosításakor.
Megjegyzés:
Az ilyen kapcsolatok javítása az Entity Framework alapértelmezett viselkedése a 2008-as első verzió óta. Az EF Core előtt nem volt neve, és nem lehetett módosítani. Most már ClientSetNull néven ismert, ahogyan azt a következő szakasz leírja.
Az adatbázisok úgy is konfigurálhatók, hogy null értékeket kaszkádozzanak, amikor törlik a fő/szülő elemet egy opcionális kapcsolatban. Ez azonban sokkal kevésbé gyakori, mint a kaszkádolt törlések használata az adatbázisban. Ha egyidejűleg kaszkádolt törléseket és kaszkádolt null értékeket használ az adatbázisban, az SQL Server használatakor szinte mindig kapcsolati ciklusokat eredményez. A kaszkádolt nullértékek konfigurálásáról a következő szakaszban talál további információt.
Kaszkádolt viselkedés konfigurálása
Jótanács
Mindenképpen olvassa el a fenti szakaszokat, mielőtt idejön. A konfigurációs opciók valószínűleg nem fognak értelmet nyerni, ha az előző anyag nem érthető.
Kaszkádolt viselkedések kapcsolatonként konfigurálhatók a OnDelete metódusban OnModelCreating. Például:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Blog>()
.HasOne(e => e.Owner)
.WithOne(e => e.OwnedBlog)
.OnDelete(DeleteBehavior.ClientCascade);
}
Az entitástípusok közötti kapcsolatok konfigurálásáról további információt a Kapcsolatok című témakörben talál.
OnDelete elfogad egy értéket az elismerhetően zavaros DeleteBehavior enumerálásból. Ez az enumerálás meghatározza az EF Core viselkedését a nyomon követett entitásokon, valamint a kaszkádolt törlés konfigurálását az adatbázisban, amikor az EF-t a séma létrehozásához használják.
Az adatbázissémára gyakorolt hatás
Az alábbi táblázat az egyes OnDelete értékek eredményét mutatja, amikor az EF Core migrációk vagy a EnsureCreated által létrehozott külföldi kulcs megszorításra alkalmazzák.
| DeleteBehavior | Az adatbázissémára gyakorolt hatás |
|---|---|
| Vízesés | TÖRLÉS ELŐRENDÉLÉSESEN (CASCADE) |
| Korlátoz | TÖRLÉS KORLÁTOZÁSAKOR |
| NincsAkció | alapértelmezett adatbázis |
| SetNull | "TÖRLÉSNÉL NULLA ÉRTÉK BEÁLLÍTÁSA" |
| ClientSetNull | alapértelmezett adatbázis |
| ClientCascade | alapértelmezett adatbázis |
| ClientNoAction | alapértelmezett adatbázis |
Az ON DELETE NO ACTION (az adatbázis alapértelmezett értéke) és ON DELETE RESTRICT viselkedése a relációs adatbázisokban általában azonos vagy nagyon hasonló. Annak ellenére, hogy mi NO ACTION jelentheti ezt, mindkét lehetőség hivatkozási korlátozásokat kényszerít. A különbség, ha van ilyen, az az, amikor az adatbázis ellenőrzi a korlátozásokat. Ellenőrizze az adatbázis dokumentációját, hogy milyen különbségek vannak ON DELETE NO ACTION és ON DELETE RESTRICT között az adatbázis rendszerében.
Az SQL Server nem támogatja ON DELETE RESTRICT, ezért ON DELETE NO ACTION inkább használják.
Az egyetlen érték, amely kaszkádolt viselkedést okoz az adatbázisban, az Cascade és SetNulla . Az összes többi érték úgy konfigurálja az adatbázist, hogy ne kaszkádolt legyen a módosítások.
A SaveChanges viselkedésének hatása
A következő szakaszok táblázatai azt ismertetik, hogy mi történik a függő/gyermek entitásokkal a fő/szülő törlésekor vagy a függő/gyermek entitásokhoz való viszonyának megszakadásakor. Minden táblázat az alábbiak egyikét fedi le:
- Nem kötelező (null értékű FK) és kötelező (nem null értékű FK) kapcsolatok
- Ha a dbContext betölti és nyomon követi az eltartottakat/gyermekeket, és csak az adatbázisban vannak
Szükséges kapcsolat a eltartottakkal/betöltött gyermekekkel
| DeleteBehavior | A főnév/szülő törlésekor | A főnévtől/szülőtől való leváláskor |
|---|---|---|
| Vízesés | Az EF Core által törölt függők | Az EF Core által törölt függők |
| Korlátoz | InvalidOperationException |
InvalidOperationException |
| NincsAkció | InvalidOperationException |
InvalidOperationException |
| SetNull |
SqlException az adatbázis létrehozásáról |
SqlException az adatbázis létrehozásáról |
| ClientSetNull | InvalidOperationException |
InvalidOperationException |
| ClientCascade | Az EF Core által törölt függők | Az EF Core által törölt függők |
| ClientNoAction | DbUpdateException |
InvalidOperationException |
Megjegyzések:
- Az ehhez hasonló kötelező kapcsolatok alapértelmezett értéke.
Cascade - Ha a kötelező kapcsolatok esetében nem kaszkádtörlést használ, akkor kivétel keletkezik, amikor a SaveChanges meghívásra kerül.
- Ez általában az
InvalidOperationExceptionEF Core-tól származik, mivel a rendszer az érvénytelen állapotot észleli a betöltött gyermekekben/eltartottakban. -
ClientNoActionKényszeríti az EF Core-t, hogy ne ellenőrizze a javítás függő objektumait, mielőtt elküldené őket az adatbázisba, így ebben az esetben az adatbázis kivételt vet fel, amelyet aztán a SaveChangesDbUpdateExceptionbecsomagol. -
SetNullaz adatbázis létrehozásakor a rendszer elutasítja, mivel az idegenkulcs-oszlop nem null értékű.
- Ez általában az
- Mivel a függők/gyermekek betöltve vannak, az EF Core mindig törli őket, és soha nem hagyják el az adatbázis törlését.
Szükséges kapcsolat a függőkkel/gyermekekkel nem lett betöltve
| DeleteBehavior | A főnév/szülő törlésekor | A főnévtől/szülőtől való leváláskor |
|---|---|---|
| Vízesés | Az adatbázis által törölt függők | Nincs adat. |
| Korlátoz | DbUpdateException |
Nincs adat. |
| NincsAkció | DbUpdateException |
Nincs adat. |
| SetNull |
SqlException az adatbázis létrehozásáról |
Nincs adat. |
| ClientSetNull | DbUpdateException |
Nincs adat. |
| ClientCascade | DbUpdateException |
Nincs adat. |
| ClientNoAction | DbUpdateException |
Nincs adat. |
Megjegyzések:
- A kapcsolat megszakítása itt nem érvényes, mivel a függők/gyermekek nincsenek betöltve.
- Az ehhez hasonló kötelező kapcsolatok alapértelmezett értéke.
Cascade - Ha a kötelező kapcsolatok esetében nem kaszkádtörlést használ, akkor kivétel keletkezik, amikor a SaveChanges meghívásra kerül.
- Ez általában azért van
DbUpdateException, mert a függők/gyermekek nincsenek betöltve, így az érvénytelen állapotot csak az adatbázis képes észlelni. SaveChanges ezután az adatbázis-kivételt egyDbUpdateException-be csomagolja. -
SetNullaz adatbázis létrehozásakor a rendszer elutasítja, mivel az idegenkulcs-oszlop nem null értékű.
- Ez általában azért van
Nem kötelező kapcsolat az eltartottakkal/gyerekekkel
| DeleteBehavior | A főnév/szülő törlésekor | A főnévtől/szülőtől való leváláskor |
|---|---|---|
| Vízesés | Az EF Core által törölt függők | Az EF Core által törölt függők |
| Korlátoz | Az EF Core által null értékre beállított függő FK-k | Az EF Core által null értékre beállított függő FK-k |
| NincsAkció | Az EF Core által null értékre beállított függő FK-k | Az EF Core által null értékre beállított függő FK-k |
| SetNull | Az EF Core által null értékre beállított függő FK-k | Az EF Core által null értékre beállított függő FK-k |
| ClientSetNull | Az EF Core által null értékre beállított függő FK-k | Az EF Core által null értékre beállított függő FK-k |
| ClientCascade | Az EF Core által törölt függők | Az EF Core által törölt függők |
| ClientNoAction | DbUpdateException |
Az EF Core által null értékre beállított függő FK-k |
Megjegyzések:
- Az ilyen választható kapcsolatok alapértelmezett értéke a következő
ClientSetNull. - A függők/gyermekek soha nem törlődnek, kivéve, ha
CascadeClientCascadekonfigurálva vannak. - Minden más érték miatt a függő FK-k null értékre vannak állítva az EF Core által...
- ... kivéve
ClientNoAction, amely arra utasítja az EF Core-t, hogy ne érintse meg az eltartottak/gyermekek idegen kulcsait a fő/szülő törlésekor. Az adatbázis ezért kivételt dob, amelyet a SaveChangesDbUpdateExceptionformájában becsomagol.
- ... kivéve
Nem kötelező, nem betöltött kapcsolat függőkkel/gyermekekkel
| DeleteBehavior | A főnév/szülő törlésekor | A főnévtől/szülőtől való leváláskor |
|---|---|---|
| Vízesés | Az adatbázis által törölt függők | Nincs adat. |
| Korlátoz | DbUpdateException |
Nincs adat. |
| NincsAkció | DbUpdateException |
Nincs adat. |
| SetNull | A függő FK-k adatbázisonként null értékre van állítva | Nincs adat. |
| ClientSetNull | DbUpdateException |
Nincs adat. |
| ClientCascade | DbUpdateException |
Nincs adat. |
| ClientNoAction | DbUpdateException |
Nincs adat. |
Megjegyzések:
- A kapcsolat megszakítása itt nem érvényes, mivel a függők/gyermekek nincsenek betöltve.
- Az ilyen választható kapcsolatok alapértelmezett értéke a következő
ClientSetNull. - A függőket/gyermekeket be kell tölteni az adatbázis kivételének elkerülése érdekében, kivéve, ha az adatbázist úgy konfigurálták, hogy a törléseket vagy null értékeket kaszkádolják.