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.
Megjegyzés:
Ez a funkció a lekérdezéstípusok neve alatt lett hozzáadva. Később kulcs nélküli entitástípusokra átnevezték.
A normál entitástípusok mellett az EF Core-modell kulcs nélküli entitástípusokat is tartalmazhat, amelyek segítségével adatbázis-lekérdezéseket hajthat végre olyan adatokon, amelyek nem tartalmaznak kulcsértékeket.
Kulcs nélküli entitástípusok definiálása
A kulcs nélküli entitástípusok az alábbiak szerint definiálhatók:
[Keyless]
public class BlogPostsCount
{
public string BlogName { get; set; }
public int PostCount { get; set; }
}
Kulcs nélküli entitástípusok jellemzői
A kulcs nélküli entitástípusok számos olyan leképezési képességet támogatnak, mint a normál entitástípusok, például az öröklési leképezés és a navigációs tulajdonságok. A relációs tárolókban a céladatbázis-objektumokat és -oszlopokat fluent API-metódusokkal vagy adatjegyzetekkel konfigurálhatják.
Azonban eltérnek a normál entitástípusoktól abban, hogy:
- Kulcs nem definiálható.
- A DbContext-ben soha nem követik nyomon a módosításokat, ezért az adatbázisba soha nem kerülnek beszúrásra, frissítésre vagy törlésre.
- Soha nem fedezik fel a konvenció révén.
- Csak a navigációs leképezési képességek egy részhalmazát támogatja, különösen:
- Előfordulhat, hogy soha nem a kapcsolat fő végeként működnek.
- Előfordulhat, hogy nem rendelkeznek saját entitásokra való navigációval
- Ezek csak a normál entitásokra mutató hivatkozási navigációs tulajdonságokat tartalmazhatnak.
- Az entitások nem tartalmazhatnak navigációs tulajdonságokat a kulcs nélküli entitástípusokhoz.
-
[Keyless]adatannotációval vagy.HasNoKey()metódushívással kell konfigurálni. - Leképezhető egy definiáló lekérdezésre. A meghatározó lekérdezés a modellben deklarált lekérdezés, amely egy kulcs nélküli entitástípus adatforrásaként működik.
- Lehet hierarchiát használni, de TPH-ként kell leképezni.
- Nem használható táblafelosztás vagy entitásfelosztás.
Használati forgatókönyvek
A kulcs nélküli entitástípusok néhány fő használati forgatókönyve a következő:
- Sql-lekérdezések visszatérési típusaként szolgál.
- Olyan adatbázisnézetek leképezése, amelyek nem tartalmaznak elsődleges kulcsot.
- Térképezés olyan táblákra, amelyekhez nincs meghatározva az elsődleges kulcs.
- Megfeleltetés a modellben definiált lekérdezésekhez.
Adatbázis-objektumok leképezése
A kulcs nélküli entitástípus adatbázis-objektumhoz való leképezése a ToTable fluent API-val ToView érhető el. Az EF Core szempontjából az ebben a metódusban megadott adatbázis-objektumot nézetként kezelik, ami azt jelenti, hogy írásvédett lekérdezési forrás, és nem lehet frissítési, beszúrási vagy törlési műveletek célpontja. Ez azonban nem jelenti azt, hogy az adatbázis-objektumnak valójában adatbázisnézetnek kell lennie. Másik lehetőségként adatbázistábla is lehet, amely írásvédettként lesz kezelve. Ezzel szemben a normál entitástípusok esetében az EF Core feltételezi, hogy a ToTable metódusban megadott adatbázis-objektumok táblaként kezelhetők, ami azt jelenti, hogy lekérdezési forrásként is használható, de frissítési, törlési és beszúrási műveletekkel is megcélozható. Valójában megadhatja egy adatbázisnézet ToTable nevét, és mindennek megfelelően kell működnie, amíg a nézet frissíthetőnek van konfigurálva az adatbázisban.
példa
Az alábbi példa bemutatja, hogyan lehet kulcs nélküli entitástípusokat használni egy adatbázisnézet lekérdezéséhez.
Jótanács
A cikk mintáját a GitHubon tekintheti meg.
Először egy egyszerű blog- és postmodellt határozunk meg:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public ICollection<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
}
Ezután meghatározunk egy egyszerű adatbázisnézetet, amely lehetővé teszi az egyes blogokhoz társított bejegyzések számának lekérdezését:
await db.Database.ExecuteSqlRawAsync(
@"CREATE VIEW View_BlogPostCounts AS
SELECT b.Name, Count(p.PostId) as PostCount
FROM Blogs b
JOIN Posts p on p.BlogId = b.BlogId
GROUP BY b.Name");
Ezután meghatározunk egy osztályt, amely az adatbázisnézetből származó eredményt tárolja:
public class BlogPostsCount
{
public string BlogName { get; set; }
public int PostCount { get; set; }
}
Ezután konfiguráljuk a kulcs nélküli entitástípust az OnModelCreatingben az HasNoKey API használatával.
A fluent configuration API használatával konfiguráljuk a kulcs nélküli entitástípus leképezését:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<BlogPostsCount>(
eb =>
{
eb.HasNoKey();
eb.ToView("View_BlogPostCounts");
eb.Property(v => v.BlogName).HasColumnName("Name");
});
}
Ezután konfiguráljuk a DbContext-t, hogy tartalmazza a DbSet<T>-t.
public DbSet<BlogPostsCount> BlogPostCounts { get; set; }
Végül lekérdezhetjük az adatbázis nézetét a szokásos módon:
var postCounts = await db.BlogPostCounts.ToListAsync();
foreach (var postCount in postCounts)
{
Console.WriteLine($"{postCount.BlogName} has {postCount.PostCount} posts.");
Console.WriteLine();
}
Jótanács
Vegye figyelembe, hogy egy környezeti szintű lekérdezési tulajdonságot (DbSet) is definiáltunk, amely gyökérként szolgál az ilyen típusú lekérdezésekhez.
Jótanács
A memóriabeli szolgáltatóval leképezett nézetekre leképezett kulcs nélküli entitástípusok teszteléséhez lekérdezéshez kell őket leképezni ToInMemoryQuery. További információt a memórián belüli szolgáltató dokumentációjában talál.