Komplexní typy – EF Designer
Toto téma ukazuje, jak mapovat komplexní typy pomocí Návrháře entity Framework (EF Designer) a jak dotazovat entity, které obsahují vlastnosti komplexního typu.
Následující obrázek ukazuje hlavní okna, která se používají při práci s nástrojem EF Designer.
Poznámka
Při vytváření konceptuálního modelu se můžou v seznamu chyb zobrazit upozornění na nemapované entity a přidružení. Tato upozornění můžete ignorovat, protože jakmile se rozhodnete vygenerovat databázi z modelu, chyby zmizí.
Co je komplexní typ
Komplexní typy jsou nes skalární vlastnosti typů entit, které umožňují uspořádání skalárních vlastností v rámci entit. Podobně jako entity se komplexní typy skládají ze skalárních vlastností nebo jiných vlastností komplexního typu.
Při práci s objekty, které představují komplexní typy, mějte na paměti následující:
- Komplexní typy nemají klíče, a proto nemohou existovat nezávisle. Komplexní typy mohou existovat pouze jako vlastnosti typů entit nebo jiných komplexních typů.
- Komplexní typy se nemohou účastnit přidružení a nemohou obsahovat navigační vlastnosti.
- Vlastnosti komplexního typu nemohou být null. **InvalidOperationException **nastane při zavolání DbContext.SaveChanges a je zjištěn komplexní objekt null. Skalární vlastnosti složitých objektů mohou být null.
- Komplexní typy nemohou dědit z jiných komplexních typů.
- Komplexní typ musíte definovat jako třídu.
- EF detekuje změny členů v objektu komplexního typu při zavolání DbContext.DetectChanges . Entity Framework volá Funkci DetectChanges automaticky, pokud jsou volány následující členy: DbSet.Find, DbSet.Local, DbSet.Remove, DbSet.Add, DbSet.Attach, DbContext.SaveChanges, DbContext.GetValidationErrors, DbContext.Entry, DbChangeTracker.Entrys.
Refaktoring vlastností entity na nový komplexní typ
Pokud už máte entitu v konceptuálním modelu, můžete některé vlastnosti refaktorovat na vlastnost komplexního typu.
Na ploše návrháře vyberte jednu nebo více vlastností (s výjimkou navigačních vlastností) entity, klikněte pravým tlačítkem myši a vyberte Refaktoring –> Přesunout na nový komplexní typ.
Do prohlížeče modelů se přidá nový komplexní typ s vybranými vlastnostmi. Komplexní typ má výchozí název.
Komplexní vlastnost nově vytvořeného typu nahradí vybrané vlastnosti. Všechna mapování vlastností se zachovají.
Vytvoření nového komplexního typu
Můžete také vytvořit nový komplexní typ, který neobsahuje vlastnosti existující entity.
Klikněte pravým tlačítkem myši na složku Komplexní typy v prohlížeči modelů, přejděte na Příkaz AddNew Complex Type.... Případně můžete vybrat složku Komplexní typy a stisknout klávesu Insert na klávesnici.
Do složky se přidá nový komplexní typ s výchozím názvem. Do typu teď můžete přidat vlastnosti.
Přidání vlastností do komplexního typu
Vlastnosti komplexního typu mohou být skalární typy nebo existující komplexní typy. Vlastnosti komplexního typu však nemohou mít cyklický odkaz. Například komplexní typ OnsiteCourseDetails nemůže mít vlastnost komplexního typu OnsiteCourseDetails.
Vlastnost můžete do komplexního typu přidat libovolným způsobem uvedeným níže.
Klikněte pravým tlačítkem myši na komplexní typ v prohlížeči modelů, přejděte na příkaz Přidat, přejděte na skalární vlastnost nebo komplexní vlastnost a vyberte požadovaný typ vlastnosti. Případně můžete vybrat komplexní typ a stisknout klávesu Insert na klávesnici.
Do komplexního typu se přidá nová vlastnost s výchozím názvem.
NEBO -
Klikněte pravým tlačítkem myši na vlastnost entity na ploše EF Designeru a vyberte Kopírovat, potom klikněte pravým tlačítkem myši na komplexní typ v Prohlížeči modelů a vyberte Vložit.
Přejmenování komplexního typu
Při přejmenování komplexního typu se všechny odkazy na tento typ aktualizují v celém projektu.
Pomalu poklikejte na složitý typ v prohlížeči modelů. Název bude vybraný a v režimu úprav.
NEBO -
Klikněte pravým tlačítkem myši na komplexní typ v prohlížeči modelů a vyberte Přejmenovat.
NEBO -
V prohlížeči modelů vyberte komplexní typ a stiskněte klávesu F2.
NEBO -
Klikněte pravým tlačítkem myši na komplexní typ v prohlížeči modelů a vyberte Vlastnosti. Upravte název v okně Vlastnosti .
Přidání existujícího komplexního typu do entity a mapování jeho vlastností na sloupce tabulky
Klikněte pravým tlačítkem myši na entitu, přejděte na příkaz Přidat nový a vyberte Komplexní vlastnost. Do entity se přidá vlastnost komplexního typu s výchozím názvem. K vlastnosti je přiřazen výchozí typ (vybraný z existujících komplexních typů).
Přiřaďte požadovaný typ vlastnosti v okně Vlastnosti . Po přidání komplexní vlastnosti typu do entity je nutné mapovat její vlastnosti na sloupce tabulky.
Klikněte pravým tlačítkem myši na typ entity na návrhové ploše nebo v prohlížeči modelů a vyberte Mapování tabulek. Mapování tabulek se zobrazí v okně Podrobnosti mapování .
Rozbalte Mapy na <uzel Název> tabulky. Zobrazí se uzel Mapování sloupců.
Rozbalte uzel Mapování sloupců. Zobrazí se seznam všech sloupců v tabulce. Výchozí vlastnosti (pokud existují), na které jsou sloupce mapovány, jsou uvedeny pod nadpisem Hodnota/vlastnost .
Vyberte sloupec, který chcete mapovat, a klikněte pravým tlačítkem myši na odpovídající pole Hodnota/vlastnost . Zobrazí se rozevírací seznam všech skalárních vlastností.
Vyberte příslušnou vlastnost.
Opakujte kroky 6 a 7 pro každý sloupec tabulky.
Poznámka
Pokud chcete odstranit mapování sloupců, vyberte sloupec, který chcete namapovat, a potom klikněte na pole Hodnota/vlastnost . Potom v rozevíracím seznamu vyberte Odstranit .
Mapování importu funkce na komplexní typ
Importy funkcí jsou založené na uložených procedurách. Pokud chcete namapovat import funkce na komplexní typ, musí sloupce vrácené odpovídající uloženou procedurou odpovídat vlastnostem komplexního typu v čísle a musí mít typy úložiště, které jsou kompatibilní s typy vlastností.
Poklikejte na importovanou funkci, kterou chcete namapovat na komplexní typ.
Vyplňte nastavení pro import nové funkce následujícím způsobem:
Zadejte uloženou proceduru, pro kterou vytváříte import funkce do pole Název uložené procedury. Toto pole je rozevírací seznam, který zobrazuje všechny uložené procedury v modelu úložiště.
Zadejte název importu funkce do pole Název importu funkce.
Jako návratový typ vyberte Komplexní a pak zadejte konkrétní komplexní návratový typ tak, že v rozevíracím seznamu zvolíte odpovídající typ.
Klepněte na tlačítko OK. Položka importu funkce se vytvoří v koncepčním modelu.
Přizpůsobení mapování sloupců pro import funkcí
- Klikněte pravým tlačítkem myši na import funkce v prohlížeči modelů a vyberte Mapování importu funkcí. Zobrazí se okno Podrobnosti mapování a zobrazí výchozí mapování pro import funkce. Šipky označují mapování mezi hodnotami sloupců a hodnotami vlastností. Ve výchozím nastavení se názvy sloupců považují za stejné jako názvy vlastností komplexního typu. Výchozí názvy sloupců se zobrazí v šedém textu.
- V případě potřeby změňte názvy sloupců tak, aby odpovídaly názvům sloupců vráceným uloženou procedurou odpovídající importu funkce.
Odstranění komplexního typu
Když odstraníte komplexní typ, odstraní se typ z konceptuálního modelu a mapování pro všechny instance typu. Odkazy na typ se ale neaktualizují. Pokud má například entita komplexní typ vlastnost typu ComplexType1 a ComplexType1 je odstraněna v prohlížeči modelů, odpovídající vlastnost entity není aktualizována. Model se neověří, protože obsahuje entitu, která odkazuje na odstraněný komplexní typ. Pomocí Návrháře entit můžete aktualizovat nebo odstranit odkazy na odstraněné komplexní typy.
Klikněte pravým tlačítkem myši na komplexní typ v prohlížeči modelů a vyberte Odstranit.
NEBO -
Vyberte komplexní typ v prohlížeči modelů a stiskněte klávesu Delete na klávesnici.
Dotaz na entity obsahující vlastnosti komplexního typu
Následující kód ukazuje, jak spustit dotaz, který vrátí kolekci objektů typu entity, které obsahují komplexní typ vlastnosti.
using (SchoolEntities context = new SchoolEntities())
{
var courses =
from c in context.OnsiteCourses
order by c.Details.Time
select c;
foreach (var c in courses)
{
Console.WriteLine("Time: " + c.Details.Time);
Console.WriteLine("Days: " + c.Details.Days);
Console.WriteLine("Location: " + c.Details.Location);
}
}