Spatial – Code First
Poznámka
Pouze EF5 – funkce, rozhraní API atd. probírané na této stránce byly představeny v Entity Frameworku 5. Pokud používáte starší verzi, některé nebo všechny informace nemusí být platné.
Video a podrobný návod ukazuje, jak mapovat prostorové typy pomocí entity Framework Code First. Ukazuje také, jak pomocí dotazu LINQ najít vzdálenost mezi dvěma umístěními.
Tento názorný postup použije Code First k vytvoření nové databáze, ale můžete také použít Code First k existující databázi.
Podpora prostorového typu byla zavedena v Entity Frameworku 5. Všimněte si, že pokud chcete používat nové funkce, jako jsou prostorové typy, výčty a funkce s hodnotou tabulky, musíte cílit na rozhraní .NET Framework 4.5. Visual Studio 2012 ve výchozím nastavení cílí na .NET 4.5.
Pokud chcete použít prostorové datové typy, musíte také použít zprostředkovatele Entity Framework, který má prostorovou podporu. Další informace najdete v podpoře poskytovatele prostorových typů .
Existují dva hlavní datové typy prostorových dat: zeměpis a geometrie. Zeměpisný datový typ ukládá elipsoidální data (například souřadnice zeměpisné šířky a délky GPS). Datový typ geometrie představuje euklidský (plochý) souřadnicový systém.
Přehrát video
Toto video ukazuje, jak mapovat prostorové typy pomocí entity Framework Code First. Ukazuje také, jak pomocí dotazu LINQ najít vzdálenost mezi dvěma umístěními.
Autor: Julia Kornich
Předpoklady
K dokončení tohoto návodu budete muset mít nainstalovanou edici Visual Studio 2012, Ultimate, Premium, Professional nebo Web Express.
Nastavení projektu
- Otevření sady Visual Studio 2012
- V nabídce Soubor přejděte na příkaz Nový a klepněte na příkaz Projekt
- V levém podokně klikněte na Visual C# a pak vyberte šablonu konzoly .
- Jako název projektu zadejte SpatialCodeFirst a klikněte na OK.
Definování nového modelu pomocí code First
Při použití vývoje Code First obvykle začínáte psaním tříd rozhraní .NET Framework, které definují váš konceptuální (doménový) model. Následující kód definuje třídu univerzity.
Univerzita má vlastnost Location typu DbGeography. Chcete-li použít Typ DbGeography, musíte přidat odkaz na System.Data.Entity sestavení a také přidat System.Data.Spatial using příkaz.
Otevřete soubor Program.cs a vložte následující příkazy using v horní části souboru:
using System.Data.Spatial;
Do souboru Program.cs přidejte následující definici třídy university.
public class University
{
public int UniversityID { get; set; }
public string Name { get; set; }
public DbGeography Location { get; set; }
}
Definování odvozeného typu DbContext
Kromě definování entit je nutné definovat třídu, která je odvozena z DbContext a zveřejňuje DbSet<TEntity> vlastnosti. Vlastnosti DbSet<TEntity> znají kontext, které typy chcete zahrnout do modelu.
Instance odvozeného typu DbContext spravuje objekty entity během doby běhu, což zahrnuje naplnění objektů dat z databáze, sledování změn a zachování dat do databáze.
Typy DbContext a DbSet jsou definovány v sestavení EntityFramework. K této knihovně DLL přidáme odkaz pomocí balíčku NuGet EntityFramework.
- V Průzkumník řešení klikněte pravým tlačítkem myši na název projektu.
- Vyberte Spravovat balíčky NuGet...
- V dialogovém okně Spravovat balíčky NuGet vyberte kartu Online a zvolte balíček EntityFramework .
- Klikněte na Nainstalovat.
Všimněte si, že kromě sestavení EntityFramework se také přidá odkaz na sestavení System.ComponentModel.DataAnnotations.
V horní části souboru Program.cs přidejte následující příkaz using:
using System.Data.Entity;
Do souboru Program.cs přidejte definici kontextu.
public partial class UniversityContext : DbContext
{
public DbSet<University> Universities { get; set; }
}
Uchování a načtení dat
Otevřete soubor Program.cs, kde je definována metoda Main. Do funkce Main přidejte následující kód.
Kód přidá do kontextu dva nové university objekty. Prostorové vlastnosti se inicializují pomocí metody DbGeography.FromText. Zeměpisný bod reprezentovaný jako WellKnownText je předán metodě. Kód pak uloží data. Potom se vytvoří a spustí dotaz LINQ, který vrátí objekt univerzity, který je nejblíže zadanému umístění.
using (var context = new UniversityContext ())
{
context.Universities.Add(new University()
{
Name = "Graphic Design Institute",
Location = DbGeography.FromText("POINT(-122.336106 47.605049)"),
});
context. Universities.Add(new University()
{
Name = "School of Fine Art",
Location = DbGeography.FromText("POINT(-122.335197 47.646711)"),
});
context.SaveChanges();
var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)");
var university = (from u in context.Universities
orderby u.Location.Distance(myLocation)
select u).FirstOrDefault();
Console.WriteLine(
"The closest University to you is: {0}.",
university.Name);
}
Zkompilujte a spusťte aplikaci. Program vytvoří následující výstup:
The closest University to you is: School of Fine Art.
Zobrazení vygenerované databáze
Při prvním spuštění aplikace vytvoří Entity Framework databázi za vás. Vzhledem k tomu, že máme nainstalovanou sadu Visual Studio 2012, vytvoří se databáze v instanci LocalDB. Ve výchozím nastavení entity Framework pojmenuje databázi za plně kvalifikovaný název odvozeného kontextu (v tomto příkladu je SpatialCodeFirst.UniversityContext). Další časy, kdy bude použita existující databáze.
Všimněte si, že pokud po vytvoření databáze provedete nějaké změny modelu, měli byste k aktualizaci schématu databáze použít Migrace Code First. Příklad použití migrací najdete v části Code First do nové databáze .
Pokud chcete zobrazit databázi a data, postupujte takto:
- V hlavní nabídce sady Visual Studio 2012 vyberte Zobrazit ->SQL Server Průzkumník objektů.
- Pokud místní databáze není v seznamu serverů, klikněte na tlačítko pravé myši na SQL Serveru a vyberte Přidat SQL Server Použít výchozí ověřování systému Windows pro připojení k instanci LocalDB.
- Rozbalení uzlu LocalDB
- Rozbalte složku Databáze, abyste viděli novou databázi a přejděte do tabulky Univerzity.
- Pokud chcete zobrazit data, klikněte pravým tlačítkem myši na tabulku a vyberte Zobrazit data.
Souhrn
V tomto názorném postupu jsme se podívali, jak používat prostorové typy s Entity Framework Code First.