Пространственный — код в первую очередь

Замечание

Только начиная с EF5 — функции, API и т. д., рассмотренные на этой странице, были представлены в Entity Framework 5. Если вы используете более раннюю версию, некоторые или все сведения не применяются.

Видео и пошаговое руководство показывают, как сопоставить пространственные типы с Entity Framework Code First. В нем также показано, как использовать запрос LINQ для поиска расстояния между двумя расположениями.

В этом пошаговом руководстве будет использоваться code First для создания новой базы данных, но вы также можете использовать Code First для существующей базы данных.

Поддержка пространственных типов появилась в Entity Framework 5. Обратите внимание, что для использования новых функций, таких как пространственный тип, перечисления и табличное значение функций, необходимо использовать платформу .NET Framework 4.5. Visual Studio 2012 предназначен для .NET 4.5 по умолчанию.

Чтобы использовать типы пространственных данных, необходимо также использовать поставщик Entity Framework с пространственной поддержкой. Смотрите поддержку поставщика пространственных типов для получения дополнительной информации.

Существует два основных типа пространственных данных: география и геометрия. Тип данных geography хранит эллипсоидальные данные (например, координаты широты и долготы GPS). Тип данных геометрии представляет систему координат Euclidean (плоскую).

Посмотрите видео

В этом видео показано, как отображать пространственные типы с помощью Entity Framework Code First. В нем также показано, как использовать запрос LINQ для поиска расстояния между двумя расположениями.

Представлено: Джулия Корнич

Видео: WMVMP4 | WMV | (ZIP)

Необходимые условия

Для выполнения этого пошагового руководства вам потребуется установить Visual Studio 2012, Ultimate, Premium, Professional или Web Express.

Настройка проекта

  1. Откройте Visual Studio 2012
  2. В меню "Файл" наведите указатель мыши на "Создать", а затем щелкните "Проект"
  3. В левой области щелкните Visual C#, а затем выберите шаблон консоли
  4. Введите SpatialCodeFirst в качестве имени проекта и нажмите кнопку ОК

Определение новой модели с помощью кода в первую очередь

При использовании разработки Code First вы обычно начинаете с написания классов .NET Framework, определяющих концептуальную модель (домен). Приведенный ниже код определяет класс Университета.

Университет обладает свойством Location, относящимся к типу DbGeography. Чтобы использовать тип DbGeography, необходимо добавить ссылку на сборку System.Data.Entity, а также добавить инструкцию System.Data.Spatial using.

Откройте файл Program.cs и вставьте следующие инструкции using в начало файла.

using System.Data.Spatial;

Добавьте следующее определение класса университета в файл Program.cs.

public class University  
{
    public int UniversityID { get; set; }
    public string Name { get; set; }
    public DbGeography Location { get; set; }
}

Определите производный тип DbContext

Помимо определения сущностей, необходимо определить класс, производный от DbContext и предоставляющий свойства DbSet<TEntity> . Свойства DbSet<TEntity> позволяют контексту знать, какие типы необходимо включить в модель.

Экземпляр производного типа DbContext управляет объектами сущности во время выполнения, включая заполнение объектов данными из базы данных, отслеживание изменений и сохранение данных в базе данных.

Типы DbContext и DbSet определяются в сборке EntityFramework. Мы добавим ссылку на эту библиотеку DLL с помощью пакета NuGet EntityFramework.

  1. В обозревателе решений щелкните правой кнопкой мыши имя проекта.
  2. Выберите "Управление пакетами NuGet...
  3. В диалоговом окне "Управление пакетами NuGet" выберите вкладку "Интернет " и выберите пакет EntityFramework .
  4. Щелкните Установить.

Обратите внимание, что помимо сборки EntityFramework также добавляется ссылка на сборку System.ComponentModel.DataAnnotations.

В верхней части файла Program.cs добавьте следующую инструкцию using:

using System.Data.Entity;

В Program.cs добавьте определение контекста. 

public partial class UniversityContext : DbContext
{
    public DbSet<University> Universities { get; set; }
}

Сохранение и извлечение данных

Откройте файл Program.cs, в котором определен метод Main. Добавьте следующий код в функцию Main.

Код добавляет в контекст два новых объекта Университета. Пространственные свойства инициализированы с помощью метода DbGeography.FromText. Географическая точка, представленная как WellKnownText, передается методу. Затем код сохраняет данные. Затем запрос LINQ, возвращающий объект Университета, где его расположение ближе всего к указанному расположению, создается и выполняется.

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);
}

Скомпилируйте и запустите приложение. Программа выдает следующие результаты.

The closest University to you is: School of Fine Art.

Просмотр созданной базы данных

При первом запуске приложения Entity Framework создает базу данных для вас. Так как у нас установлена Visual Studio 2012, база данных будет создана в экземпляре LocalDB. По умолчанию Entity Framework присваивает базе данных полное имя производного контекста (в этом примере — SpatialCodeFirst.UniversityContext). В последующий раз будет использоваться существующая база данных.  

Обратите внимание, что при внесении изменений в модель после создания базы данных следует использовать code First Migrations для обновления схемы базы данных. Пример использования миграций см. в разделе Code First в новой базе данных.

Чтобы просмотреть базу данных и данные, сделайте следующее:

  1. В главном меню Visual Studio 2012 выберите View ->SQL Server Object Explorer.
  2. Если LocalDB не находится в списке серверов, нажмите правую кнопку мыши на SQL Server и выберите "Добавить SQL Server " Использовать проверку подлинности Windows по умолчанию для подключения к экземпляру LocalDB.
  3. Разверните узел LocalDB
  4. Разверните папку "Базы данных", чтобы просмотреть новую базу данных и перейти к таблице "Университеты"
  5. Чтобы просмотреть данные, щелкните таблицу правой кнопкой мыши и выберите "Просмотреть данные"

Сводка

В этом пошаговом руководстве мы рассмотрели, как использовать пространственные типы с entity Framework Code First.