Пространственный тип EF Core 2.2 нельзя добавить в миграцию базы данных

Я пытаюсь создать базу данных с пространственным объектом, используя EF core 2.2, и у меня возникает проблема с попыткой создать миграцию базы данных. используя https://docs.microsoft.com/en-us/ef/core/modeling/spatial , в частности:

class Country
{
    public int CountryID { get; set; }

    public string CountryName { get; set; }

    // Database includes both Polygon and MultiPolygon values
    public IGeometry Border { get; set; }
}

если я попытаюсь создать миграцию с этим, я получаю следующую ошибку:

The property 'Country.Border' is of an interface type ('IGeometry'). If it is a navigation property manually configure the relationship for this property by casting it to a mapped entity type, otherwise ignore the property using the NotMappedAttribute or 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

аналогично, если вместо этого я изменю его на тип Geometry, я получу:

The property 'Geometry.UserData' could not be mapped, because it is of type 'object' which is not a supported primitive type or a valid entity type. Either explicitly map this property, or ignore it using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

Я не знаю заранее, будет ли мой объект точкой, линией или многоугольником, поэтому он должен быть универсальным. как мне представить это в моей структуре? Кроме того, я видел, что в некоторых местах говорится, что мне нужно добавить следующий код:

public class MyDBContextFactory : IDesignTimeDbContextFactory<MyDBContext>
    {

        public MyDBContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<MyDBContext>();
            builder.UseSqlServer(cnnString, x => x.UseNetTopologySuite());
            return new MyDBContext(builder.Options);
        }
   }

но я получаю ошибку:

'SqlServerDbContextOptionsBuilder' does not contain a definition for 'UseNetTopologySuite' and no accessible extension method 'UseNetTopologySuite' accepting a first argument of type 'SqlServerDbContextOptionsBuilder' could be found (are you missing a using directive or an assembly reference?)

хотя у меня установлен пакет nuget

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
4 972
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Установите соответствующий пакет NetTopologySuite, это зависит от в базе данных, которую вы используете, например, вы используете SqlServer, поэтому вам необходимо установить этот пакет NuGet:

Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite 2) Configure your database to use NetTopologySuite (the code to edit is normally in StartUp.ConfigureServices()). Just add , x => x.UseNetTopologySuite() inside the options.UseSqlServer brackets

так это выглядит так:

services.AddDbContext<ManagerContext>(options =>
    options.UseSqlServer(
        Configuration.GetConnectionString("DefaultConnection"),
        x => x.UseNetTopologySuite()
    )
);

Мне не нужно было добавлять using к файлу, потому что я уже ссылался, к вашему сведению, если вам это нужно, это будет Microsoft.EntityFrameworkCore.

Если вы получаете справочную ошибку даже после установки пакета NuGet, перейдите в раздел «Управление пакетом NuGet» и проверьте, есть ли он в списке установленных, и если это решение «Очистите и перестройте» и перезапустите Visual Studio, это может помочь.

это та же ссылка, которую я предоставил выше, это то, что заставило меня узнать о строке, но она не работает. У меня есть builder.UseSqlServer(cnnString, x => x.UseNetTopologySuite()); , но мне говорят, что он не может найти эту ссылку. да, я добавил пакет nuget

Phil 20.02.2019 19:27

да, спасибо за внимание, но я все это сделал. ваше редактирование предполагает, что я использую dbContext так же, как и вы, а это не так. У меня есть класс, который наследуется от idesigntimedbcontextfactory, например: открытый класс MyDBContextFactory: IDesignTimeDbContextFactory<MyDBContext>. Там я использую метод CreateDBContext. это должно работать так же, но это не выглядит так же. см. мой отредактированный вопрос

Phil 20.02.2019 19:43

Ух, мой плохой, ты прав. Я сосредоточился на Install-Package NetTopologySuite вместо EFCore, о котором вы упоминали выше.

Phil 20.02.2019 23:56

Я просто хотел бы добавить для других, что вам также необходимо установить правильный версия пакета в зависимости от версии EF Core, которую вы используете.

adam0101 23.10.2019 16:11

В качестве дополнительного примечания: если вы используете шаблон фабрики дизайна, вам также необходимо добавить туда UseNetTolopogySuite().

shox 13.01.2021 21:04

Другие вопросы по теме