Подтвердить что ты не робот

System.Data.Entity.Спальная замена в ядре ASP.NET

Я пытаюсь перенести веб-форму из ASP.NET MVC в ASP.NET Core MVC. В настоящее время я пытаюсь найти способ заменить:

using System.Data.Entity.Spatial;

так как он недоступен в .NET Core или я, возможно, не смог его найти.

Есть ли способ включить этот пакет? Может быть, через пакет NuGet?

Ps. Я кратко прочитал руководство Microsoft, но не смог найти ничего связанного с ним. Для тех, кто может быть в подобной ситуации, руководство находится здесь: https://docs.asp.net/en/latest/migration/mvc.html

(Извините, если я не мог написать хороший вопрос, я пытаюсь привыкнуть к системе здесь)

4b9b3361

Ответ 1

редактировать

Эта функция является новой в EF Core 2.2 Spatial Data

Теперь вы можете использовать Microsoft.Spatial для geography и geometry пространственных операций.

Конечно, EntityframeworkCore не поддерживает пространственные данные, поэтому вы не можете создать поле с географическим типом данных в codefirst. Я предлагаю вам сделать это с помощью EntityframeworkCore SQL, пока EntityframeworkCore поддерживает пространственные данные во втором квартале 2017 года (см. это). Если ты не знаешь, как я тебе скажу.

  1. Прежде всего, вам нужно добавить поле с типом данных geography, поэтому вам нужно выполнить этот комментарий в одном из классов миграции:

    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql("ALTER TABLE [dbo].[Cities] ADD [Location] geography");
    }
    
  2. если вы используете UnitOfWork, вы можете обновить поле "Местоположение" после того, как вставили запись следующим образом:

        try
        {
            City city = new City
            {
                Title = creator.Title
            };
    
            _cities.Add(city);
    
            _uow.ExecuteSqlCommand("UPDATE Cities SET Location = geography::STPointFromText('POINT(' + CAST({0} AS VARCHAR(20)) + ' ' + CAST({1} AS VARCHAR(20)) + ')', 4326) WHERE(ID = {2})", city.Longitude, city.Latitude, city.ID);
    
            return RedirectToAction("Index");
        }
        catch
        {
            return View(creator);
        }
    
  3. И теперь, если вы хотите найти близлежащие города, вы можете использовать эту рекомендацию:

        var cities = _uow.Set<City>()
            .FromSql(@"DECLARE @g geography = geography::STPointFromText('POINT(' + CAST({0} AS VARCHAR(20)) + ' ' + CAST({1} AS VARCHAR(20)) + ')', 4326);
                       Select ID, Address, CreationDate, CreationDateInPersian, CreationDateStandard, CreatorRealName, CreatorUserID, ExLanguageID, IsActive, IsDeleted, Latitude, Longitude, ModifierRealName, ModifierUserID, ModifyDate, ModifyDateInPersian, ModifyDateStandard, PhoneNumbers, Summary, TimeStamp, Title, Image from Cities
                       ORDER BY Location.STDistance(@g) DESC;",
                       35.738083, 51.591263)
                       .Select(x => new AllRecordsViewModel
                       {
                           ID = x.ID,
                           Title = x.Title
                       })
            .ToList();
    
        return View(cities);
    

//результат для ближайших городов:

1.Tehran
2.Ankara
3.Paris
4. Вашингтон, округ Колумбия

Помните! Вы должны выбрать все записи, кроме этого поля с типом данных географии!

Ответ 2

Пространственные данные еще не поддерживаются ядром Entity Framework Core.

Spatial не запланирован на 2.0, и мы не закончили планирование версии после. Возможно, неплохо было бы опубликовать более подробную информацию о том, что вы хотели бы иметь в пространственной поддержке на https://github.com/aspnet/EntityFramework/issues/1100, например. вы используете определенные пространственные функции или вам нужны богатые пространственные типы со всеми видами пространственной функциональности, используете ли вы это только для конкретной базы данных или вам нужно написать один и тот же код для нескольких баз данных? Etc.

(Источник: блог MSDN.NET)

Я сделал временное обходное решение, чтобы включить столбец географии и использовать его в EF Core 1.0.0 и выше. Это не идеально, но пока это будет сделано. (Похоже на Hatef & rsquo; s ответ, по-видимому, ничего себе, как думают великие мысли, я думаю.)

См. принятый ответ: Ядро Entity Framework: тип Udt не поддерживается на этой платформе. (Пространственные данные - география)

Ответ 3

Это чисто потому, что Entity Framework 7 не поддерживает пространственный материал. Но. Вы можете следить за проблемой github, связанной с этим здесь. https://github.com/aspnet/EntityFramework/issues/1100

Ответ 4

РЕДАКТИРОВАТЬ:

Вот официальные документы для NetTopologySuite с EF Core (спасибо ono2012):

Пространственные данные - EF Core


Исходное сообщение:

Обновление 2018-12-10

Более поздние версии Entityframework Core теперь поддерживают пространственные данные с использованием NetTopologySuite (см. Документацию). Я думаю, что он поддерживается начиная с версии 2.1, но я бы рекомендовал 2. 2+ из-за ошибки в 2.1, когда координаты инвертируются при сохранении в базе данных.

Ваш проект должен быть нацелен на.NET Core 2. 1+ (предпочтительно 2. 2+).

Мне удалось заставить его работать с SQL Server 2016, добавив следующие пакеты nuget:

Microsoft.AspNetCore.All
Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite

Чтобы использовать его в вашем DBContext, вам нужно добавить следующие опции в вашем файле startup.cs:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<PMSdp3_Context>(o => 
                     o.UseSqlServer(connString, opt => opt.UseNetTopologySuite()));
        }