Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az adatbázisoszlopok különböző módokon hozhatják létre az értékeiket: az elsődleges kulcsoszlopok gyakran automatikusan növekvő egész számokat, más oszlopok alapértelmezett vagy számított értékeket tartalmaznak stb. Ez a lap az EF Core-val való konfigurációs értékgenerálás különböző mintáit ismerteti.
Alapértelmezett értékek
Relációs adatbázisokban az oszlopok alapértelmezett értékkel konfigurálhatók; ha egy sor az oszlop értéke nélkül van beszúrva, a program az alapértelmezett értéket használja.
Egy tulajdonság alapértelmezett értékét konfigurálhatja:
modelBuilder.Entity<Blog>()
.Property(b => b.Rating)
.HasDefaultValue(3);
Megadhat egy SQL-töredéket is, amely az alapértelmezett érték kiszámítására szolgál:
modelBuilder.Entity<Blog>()
.Property(b => b.Created)
.HasDefaultValueSql("getdate()");
Az EF 10-től kezdve az SQL Server esetében explicit módon megadhatja az alapértelmezett értékkorlátozások nevét, így jobban szabályozhatja az adatbázissémát.
modelBuilder.Entity<Blog>()
.Property(b => b.Rating)
.HasDefaultValue(3, "DF_Blog_IsActive");
modelBuilder.Entity<Blog>()
.Property(b => b.Created)
.HasDefaultValueSql("getdate()" , "DF_Blog_IsActive");
Meghívhatja az összes alapértelmezett korlátozás automatikus elnevezésének engedélyezését is UseNamedDefaultConstraints
. Vegye figyelembe, hogy ha már rendelkezik meglévő migrálással, akkor a következő migrálás a modell minden alapértelmezett korlátozását átnevezi.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.UseNamedDefaultConstraints();
}
Számított oszlopok
A legtöbb relációs adatbázisban egy oszlop úgy konfigurálható, hogy az értékét az adatbázisban számítsa ki, általában más oszlopokra hivatkozó kifejezéssel:
modelBuilder.Entity<Person>()
.Property(p => p.DisplayName)
.HasComputedColumnSql("[LastName] + ', ' + [FirstName]");
A fentiek létrehoznak egy virtuális számítási oszlopot, amelynek értékét minden alkalommal kiszámítjuk, amikor lekéri az adatbázisból. Megadhatja azt is, hogy egy számított oszlop legyen tárolva (más néven megőrzött), ami azt jelenti, hogy az minden sorfrissítéskor kiszámítódik, és a normál oszlopok mellett a lemezen is tárolódik.
modelBuilder.Entity<Person>()
.Property(p => p.NameLength)
.HasComputedColumnSql("LEN([LastName]) + LEN([FirstName])", stored: true);
Elsődleges kulcsok
Konvenció szerint a rövid, int, long vagy Guid típusú nem összetett elsődleges kulcsok úgy vannak beállítva, hogy a beszúrt entitások értékei legyenek létrehozva, ha az alkalmazás nem biztosít értéket. Az adatbázis-szolgáltató általában gondoskodik a szükséges konfigurációról; Például az SQL Server egyik numerikus elsődleges kulcsa automatikusan identitásoszlopként van beállítva.
További információért tekintse meg a kulcsokkal kapcsolatos dokumentációt, valamint az adott öröklési leképezési stratégiákra vonatkozó útmutatást.
Explicit módon konfigurálja az értékgenerálást
A fentiekben láttuk, hogy az EF Core automatikusan beállítja az értékgenerálást az elsődleges kulcsokhoz , de a nem kulcstulajdonságok esetében is érdemes lehet ugyanezt tenni. Bármely tulajdonságot úgy konfigurálhat, hogy az értéke a beszúrt entitások számára az alábbiak szerint legyen létrehozva:
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime Inserted { get; set; }
}
Hasonlóképpen, egy tulajdonság úgy is konfigurálható, hogy az értéke a hozzáadáskor vagy frissítéskor legyen létrehozva:
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime LastUpdated { get; set; }
}
Az alapértelmezett értékekkel vagy a számított oszlopokkal ellentétben nem határozzuk meg az értékek létrehozásának módját ; függ a használt adatbázis-szolgáltatótól. Az adatbázis-szolgáltatók bizonyos tulajdonságtípusokhoz automatikusan beállíthatnak értéklétrehozást, mások azonban megkövetelhetik, hogy manuálisan állítsa be az érték létrehozásának módját.
Ha például az SQL Serveren a GUID tulajdonság elsődleges kulcsként van konfigurálva, a szolgáltató automatikusan végrehajtja az értékgenerálási ügyféloldalt egy algoritmus használatával az optimális szekvenciális GUID-értékek létrehozásához. A DateTime tulajdonság megadása azonban nem lesz hatással (ValueGeneratedOnAdd alábbi szakaszát).
Hasonlóképpen, a hozzáadáskor vagy frissítéskor generált és egyidejűség-jogkivonatként megjelölt bájt[] tulajdonságok is be vannak állítva a rowversion adattípussal, így az értékek automatikusan létrejönnek az adatbázisban. A ValueGeneratedOnAdd beállítása azonban nincs hatással.
Tekintse meg a szolgáltató dokumentációját az általa támogatott értékgenerálási technikákról. Az SQL Server értékgenerálási dokumentációja itt található.
Dátum/idő érték létrehozása
Gyakori kérés, hogy legyen egy adatbázisoszlop, amely tartalmazza a sor első beszúrásának dátumát/időpontját (a hozzáadáskor generált értéket), illetve az utolsó frissítés időpontját (a hozzáadáskor vagy frissítéskor létrehozott értéket). Mivel erre különböző stratégiák léteznek, az EF Core-szolgáltatók általában nem állítják be automatikusan az értékgenerálást a dátum/idő oszlopokhoz – ezt önnek kell konfigurálnia.
Létrehozási időbélyeg
Ha egy dátum/idő oszlopot úgy konfigurál, hogy a sor létrehozási időbélyege legyen, általában egy alapértelmezett érték konfigurálásáról van szó a megfelelő SQL-függvénnyel. Az SQL Serveren például a következőket használhatja:
modelBuilder.Entity<Blog>()
.Property(b => b.Created)
.HasDefaultValueSql("getdate()");
Ügyeljen arra, hogy válassza ki a megfelelő függvényt, mivel több is létezhet (pl. vs. GETDATE()
GETUTCDATE()
).
Frissítési időbélyeg
Bár a tárolt számított oszlopok jó megoldásnak tűnnek a legutóbb frissített időbélyegek kezelésére, az adatbázisok általában nem teszik lehetővé az olyan függvények megadását, mint GETDATE()
a számított oszlopokban. Másik lehetőségként beállíthat egy adatbázis-eseményindítót is, hogy ugyanazt a hatást érje el:
CREATE TRIGGER [dbo].[Blogs_UPDATE] ON [dbo].[Blogs]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF ((SELECT TRIGGER_NESTLEVEL()) > 1) RETURN;
UPDATE B
SET LastUpdated = GETDATE()
FROM dbo.Blogs AS B
INNER JOIN INSERTED AS I
ON B.BlogId = I.BlogId
END
Az eseményindítók létrehozásával kapcsolatos információkért tekintse meg a nyers SQL migrálásban való használatával kapcsolatos dokumentációt.
Az értékgenerálás felülbírálása
Bár egy tulajdonság értékgenerálásra van konfigurálva, sok esetben még mindig megadhat egy értéket. Az, hogy ez valóban működni fog-e, a konfigurált értékgenerálási mechanizmustól függ; bár az oszlop alapértelmezett értékének használata helyett explicit értéket is megadhat, ugyanez nem végezhető el a számított oszlopokkal.
Ha explicit értékkel szeretné felülbírálni az értékgenerálást, egyszerűen állítsa be a tulajdonságot olyan értékre, amely nem az adott tulajdonság típusának alapértelmezett CLR-értéke (null
például string
, 0
for int
, Guid.Empty
Guid
stb.).
Megjegyzés:
Ha explicit értékeket próbál beszúrni az SQL Server IDENTITY-be, alapértelmezés szerint meghiúsul; kerülő megoldásért tekintse meg ezeket a dokumentumokat.
A hozzáadáskor vagy frissítéskor létrehozott értékként konfigurált tulajdonságok explicit értékének megadásához a tulajdonságot az alábbiak szerint kell konfigurálnia:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>().Property(b => b.LastUpdated)
.ValueGeneratedOnAddOrUpdate()
.Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Save);
}
Nincs értékgenerálás
A fentihez hasonló konkrét forgatókönyveken kívül a tulajdonságok általában nem rendelkeznek értékgenerálási konfigurálva; Ez azt jelenti, hogy az alkalmazáson múlik, hogy mindig adjon meg egy értéket, amelyet menteni szeretne az adatbázisba. Ezt az értéket hozzá kell rendelni az új entitásokhoz, mielőtt hozzáadja őket a környezethez.
Bizonyos esetekben azonban érdemes lehet letiltani a konvenció által beállított értékgenerálást. Például egy int típusú elsődleges kulcs általában automatikusan meg van konfigurálva úgy, hogy a hozzáadáskor értékgenerálás történjen (például SQL Serveren az identitásoszlop esetén). Ezt a következő módon tilthatja le:
public class Blog
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int BlogId { get; set; }
public string Url { get; set; }
}