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
(Извините, если я не мог написать хороший вопрос, я пытаюсь привыкнуть к системе здесь)
Ответы
Ответ 1
редактировать
Эта функция является новой в EF Core 2.2 Spatial Data
Теперь вы можете использовать Microsoft.Spatial
для geography
и geometry
пространственных операций.
Конечно, EntityframeworkCore
не поддерживает пространственные данные, поэтому вы не можете создать поле с географическим типом данных в codefirst. Я предлагаю вам сделать это с помощью EntityframeworkCore
SQL, пока EntityframeworkCore
поддерживает пространственные данные во втором квартале 2017 года (см. это). Если ты не знаешь, как я тебе скажу.
-
Прежде всего, вам нужно добавить поле с типом данных geography, поэтому вам нужно выполнить этот комментарий в одном из классов миграции:
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("ALTER TABLE [dbo].[Cities] ADD [Location] geography");
}
-
если вы используете 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);
}
-
И теперь, если вы хотите найти близлежащие города, вы можете использовать эту рекомендацию:
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()));
}
Ответ 5
С Entity Framework Core 2.2 вы можете использовать пространственную библиотеку NetTopologySuite.
Затем вы можете сделать запрос как:
var nearestCity = db.Cities
.OrderBy(c => c.Location.Distance(currentLocation))
.FirstOrDefault();
Полный пример доступен здесь: https://www.markopapic.com/finding-nearby-users-using-ef-core-spatial-data/