Räumliche Daten – Code First
Hinweis
Nur EF5 und höher: Die Features, APIs usw., die auf dieser Seite erläutert werden, wurden in Entity Framework 5 eingeführt. Wenn Sie eine frühere Version verwenden, gelten manche Informationen nicht.
In diesem Video und dieser exemplarischen Vorgehensweise wird Schritt für Schritt gezeigt, wie räumliche Datentypen mit Entity Framework Code First verwendet werden. Außerdem wird veranschaulicht, wie Sie eine LINQ-Abfrage verwenden, um einen Abstand zwischen zwei Standorten zu bestimmen.
In dieser exemplarischen Vorgehensweise wird Code First zum Erstellen einer neuen Datenbank verwendet. Sie können aber auch Code First bei einer vorhandenen Datenbank verwenden.
Die Unterstützung für räumliche Datentypen wurde in Entity Framework 5 eingeführt. Für die Verwendung der neuen Features wie räumliche Datentypen, Enumerationen und Tabellenwertfunktionen ist .NET Framework 4.5 als Ziel erforderlich. Visual Studio 2012 verwendet .NET 4.5 standardmäßig als Ziel.
Um räumliche Datentypen zu verwenden, müssen Sie außerdem einen Entity Framework-Anbieter verwenden, der räumliche Unterstützung bietet. Weitere Informationen finden Sie unter Anbieterunterstützung für räumliche Typen.
Es gibt zwei räumliche Hauptdatentypen: Geografie und Geometrie. Der Geografie-Datentyp speichert ellipsenförmige Daten, wie z. B. GPS-Breiten- und Längenkoordinaten. Der Geometrie-Datentyp stellt Daten in einem euklidischen (flachen) Koordinatensystem dar.
Video ansehen
In diesem Video wird gezeigt, wie räumliche Datentypen mit Entity Framework Code First verwendet werden. Außerdem wird veranschaulicht, wie Sie eine LINQ-Abfrage verwenden, um einen Abstand zwischen zwei Standorten zu bestimmen.
Präsentiert von: Julia Kornich
Voraussetzungen
Sie müssen Visual Studio 2012 Ultimate, Premium, Professional oder Web Express Edition installiert haben, um diese exemplarische Vorgehensweise zu absolvieren.
Einrichten des Projekts
- Öffnen Sie Visual Studio 2012.
- Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
- Klicken Sie im linken Bereich auf Visual C#, und wählen Sie dann die Vorlage Konsole aus.
- Geben Sie SpatialCodeFirst als Namen des Projekts ein, und klicken Sie auf OK.
Definieren eines neuen Modells mithilfe von Code First
Bei der Code First-Entwicklung beginnen Sie in der Regel mit dem Schreiben von .NET Framework-Klassen, die Ihr konzeptionelles Modell (Domänenmodell) definieren. Der folgende Code definiert die University-Klasse.
Die University-Klasse verfügt über die Location-Eigenschaft des DbGeography-Typs. Um den DbGeography-Typ zu verwenden, müssen Sie einen Verweis auf die System.Data.Entity-Assembly hinzufügen und auch die using-Anweisung „System.Data.Spatial” hinzufügen.
Öffnen Sie die Datei „Program.cs”, und fügen Sie die folgenden using-Anweisungen am Anfang der Datei ein:
using System.Data.Spatial;
Fügen Sie der Datei „Program.cs” die folgende University-Klassendefinition hinzu.
public class University
{
public int UniversityID { get; set; }
public string Name { get; set; }
public DbGeography Location { get; set; }
}
Definieren des abgeleiteten DbContext-Typs
Zusätzlich zur Definition von Entitäten müssen Sie eine Klasse definieren, die von DbContext abgeleitet ist und DbSet<TEntity>-Eigenschaften bereitstellt. Die DbSet<TEntity>-Eigenschaften informieren den Kontext darüber, welche Typen Sie in das Modell einbeziehen möchten.
Eine Instanz des von DbContext abgeleiteten Typs verwaltet die Entitätsobjekte während der Laufzeit, was das Auffüllen der Objekte mit Daten aus einer Datenbank, die Änderungsnachverfolgung und das persistente Speichern von Daten in der Datenbank umfasst.
Die Typen „DbContext“ und „DbSet“ werden in der EntityFramework-Assembly definiert. Fügen Sie mithilfe des NuGet-Pakets „EntityFramework“ einen Verweis auf diese DLL hinzu.
- Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen.
- Wählen Sie NuGet-Pakete verwalten... aus.
- Wählen Sie im Dialogfeld „NuGet-Pakete verwalten“ die Registerkarte Online und dann das Paket EntityFramework aus.
- Klicken Sie auf Install (Installieren).
Beachten Sie, dass zusätzlich zur EntityFramework-Assembly auch ein Verweis auf die System.ComponentModel.DataAnnotations-Assembly hinzugefügt wird.
Fügen Sie oben in der Datei „Program.cs“ die folgende using-Anweisung hinzu:
using System.Data.Entity;
Fügen Sie in „Program.cs“ die Kontextdefinition hinzu.
public partial class UniversityContext : DbContext
{
public DbSet<University> Universities { get; set; }
}
Speichern und Abrufen von Daten
Öffnen Sie die Datei „Program.cs“, in der die Main-Methode definiert ist. Fügen Sie der Main-Funktion den folgenden Code hinzu.
Der Code fügt dem Kontext zwei neue University-Objekte hinzu. Räumliche Eigenschaften werden mithilfe der DbGeography.FromText-Methode initialisiert. Der Geografiepunkt, der als WellKnownText dargestellt wird, wird an die Methode übergeben. Der Code speichert daraufhin die Daten. Anschließend wird die LINQ-Abfrage, die ein University-Objekt zurückgibt, dort wo seine Position am nächsten an der angegebenen Position ist, konstruiert und ausgeführt.
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);
}
Kompilieren Sie die Anwendung, und führen Sie sie aus. Das Programm erzeugt die folgende Ausgabe:
The closest University to you is: School of Fine Art.
Anzeigen der generierten Datenbank
Wenn Sie die Anwendung zum ersten Mal ausführen, erstellt Entity Framework eine Datenbank für Sie. Da Visual Studio 2012 installiert ist, wird die Datenbank in der LocalDB-Instanz erstellt. Standardmäßig benennt Entity Framework die Datenbank nach dem vollqualifizierten Namen des abgeleiteten Kontexts (für dieses Beispiel: SpatialCodeFirst.UniversityContext). Bei nachfolgenden Ausführungen wird die vorhandene Datenbank verwendet.
Wenn Sie Änderungen am Modell vornehmen, nachdem die Datenbank erstellt wurde, sollten Sie Code First-Migrationen verwenden, um das Datenbankschema zu aktualisieren. Ein Beispiel für die Verwendung von Migrationen finden Sie unter Code First für eine neue Datenbank.
Gehen Sie wie folgt vor, um die Datenbank und die Daten anzuzeigen:
- Wählen Sie im Hauptmenü von Visual Studio 2012 Ansicht > SQL Server-Objekt-Explorer aus.
- Wenn LocalDB nicht in der Liste der Server enthalten ist, klicken Sie mit der rechten Maustaste auf SQL Server, und wählen Sie SQL Server hinzufügen aus. Verwenden Sie die übliche Windows-Authentifizierung, um eine Verbindung mit der LocalDB-Instanz herzustellen.
- Erweitern des LocalDB-Knotens
- Erweitern Sie den Ordner Datenbanken, um die neue Datenbank anzuzeigen, und navigieren Sie zur Tabelle Universities (Universitäten).
- Klicken Sie mit der rechten Maustaste auf die Tabelle, und wählen Sie Daten anzeigen aus, um die Daten anzuzeigen.
Zusammenfassung
In dieser exemplarischen Vorgehensweise wurde erläutert, wie räumliche Datentypen mit Entity Framework Code First verwendet werden.