Пользовательские типы udts не поддерживаются в конструкторе набора данных

Обновлено: 30.04.2024

Вот простой пример, который вызывает ошибку.

(концепция: простая конечная точка для получения пользователя из базы данных)

Ошибка: System.PlatformNotSupportedException: тип Udt не поддерживается на этой платформе.

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

Как сохранить вкус этого торта, не отказываясь от географии, ведь это важная особенность?

Изменить: см. Мой ответ для текущего решения

@nagytech На самом деле не было смысла иметь строку, представляющую ее в модели, устанавливать высоту или долготу или извлекать не очень удобно, а затем вы все равно возвращаетесь к oldshool sql, проверьте ответ для моего обходного пути.

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

Хорошо, вот как я это решил:

Цель состоит в том, чтобы сохранить географию в Entity Framework Core (без использования DbGeography)

1) Я создал структуру под названием Location:

2) Добавьте его в свою модель сущности EF

3) Спрячьте это в вашем конструкторе моделей

4) Создайте миграцию (имя миграции Add-Migration)

5) Перейдите в файл миграции 1231randomnumbers1231_migrationname.cs и добавьте следующее (таким образом мы создадим еще один столбец типа geography с именем Location), а затем обновим вашу базу данных (update-database):

6) (необязательно) Я создал статический класс для обновления базы данных, это удобно, если у вас есть столбец Location в нескольких таблицах.

Это работает только в EF Core 2.0.

@nagytech, ну ты же сам это сказал. Проблема заключается в dotnetcore. Так что на самом деле решения нет, просто обходные пути. Как бы вы это улучшили, я стремлюсь к совершенству?

@nagytech Абсолютно неприемлемо, что вы проголосовали бы против одного из единственных способов, которые есть в Интернете, которые предлагают обходной путь до тех пор, пока EFCore не поддерживает DBGeography.

Эли: не делайте таких предположений. Вы действительно не знаете, кто проголосовал против или почему .

@Eli Во-первых, я не говорил, что существует «проблема» с dotnetcore, это проблема, с которой сталкивается dotnetcore - есть разница - не истолковывайте мои комментарии неправильно. Во-вторых, я не отрицал ваш ответ, но кто бы это ни сделал, не зря - ваш код изобилует уязвимостями безопасности и устаревшими функциями, которым нет места в современном коде. Что наиболее важно, поскольку такая же проблема существовала в EF4 и SQL Server 2008, это не новая проблема. Есть и другие, на самом деле, лучшие решения, если бы вы были немного более изобретательны и объективны в решении своих проблем.

ОБНОВЛЕНИЕ: Начиная с EF Core 2.2 появилась поддержка пространственных данных !:

Эли, спасибо за ваше решение. Для меня это было почти идеальное решение. У меня было 2 проблемы:

Проблемы

  1. Другое приложение также вставляет непосредственно в базу данных (временное решение, это будет изменено в будущем).
  2. При получении первых 50 объектов данные должны быть упорядочены по расстоянию, поэтому будут возвращены 50 ближайших объектов.

Решения

  1. Вместо обновления таблицы местоположений из кода я использую триггер в своей таблице посещений. Этот триггер будет заполнять или вставлять, удалять или обновлять таблицу местоположений. Таким образом, функциям создания, обновления и удаления не требуется ничего, кроме сохранения объекта.
  1. Запрос для получения первых 50 должен быть необработанным sql-запросом, который будет выглядеть следующим образом:

CRUD

Читать

Создавать

Обновлять

Удалить

Модели базы данных

Я обновил свой ответ функцией CRUD. Я также обновил триггер, теперь это 1 триггер для обновления, вставки и удаления.

Привет, не могли бы вы показать свою модель посещения? содержит ли он широту и долготу как двойные значения, в которых вы сначала используете географию в коде?

Эти решения работают, но если вы ищете дополнительные способы, вот другое решение. Поскольку EF core 2 в настоящее время не поддерживает типы географии, вы можете использовать NetTopologySuite для всей поддержки географии на стороне сервера.

Если у вас есть таблица, для которой требуется столбец географии, добавьте свойство, которое EF может сопоставить с вашей таблицей, которое имеет тип byte [] или строку. Вот так:

Здесь используются некоторые помощники для создания точек, где они находятся:

Как видите, здесь ничего особенного не происходит. Этот код на месте у вас должен быть Full CRUDS. Если вам также нужна поддержка географии на стороне базы данных (как это сделала наша команда), вы можете создать вычисляемый столбец, который использует эти данные для генерации правильного типа географии, например:

Here is a simple example that triggers the error.

(concept: simple endpoint to get a user from database)

Error: System.PlatformNotSupportedException: Type Udt is not supported on this platform.

The problem is that I'm using geography in my database but I use it as a string in my model, because entity framework core doesn't support spatial data yet.

Any way to keep this cake tasty without getting rid of geography, cause it's an important feature?

Edit : See my answer for current solution

@nagytech There was actually no point of having a string representing it in the model, setting the altitude or longitude or retrieving isn't very friendly and then you back to oldshool sql anyways, check the answer for my workaround.

In your comment you said there is 'no point of having a string representing it in the model', but you said yourself in the original question that 'I use it as a string in my model'. You're contradicting yourself, so maybe you can revise the question to be clear.

3 Answers 3

You can now choose to sort by Trending, which boosts votes that have happened recently, helping to surface more up-to-date answers.

Trending is based off of the highest score sort and falls back to it if no posts are trending.

Ok here is how I solved it:

The purpose is to keep geography in Entity Framework Core (without using DbGeography)

1) I created a struct called Location:

2) Add it to your EF Entity Model

3) Hide it in your modelbuilder

4) Generate a Migration (Add-Migration migrationname)

5) Go to your migration file 1231randomnumbers1231_migrationname.cs and add the following (this way we create another column of type geography named Location) and then update your database (update-database):

6) (optional) I created a static class to update the db, handy if you have a Location column in mulple tables.

This only works in EF Core 2.0

For EF Core 1.0 you would have to find an alternative way to replace a ',' with '.'. A good old fashion .Replace() method could do the job.

7) CRUD Examples:

@nagytech, well you just said it yourself. The problem lies with dotnetcore. So there really is no solution, just workarounds, How would you improve this, I'm eager for perfection?

@Eli First, I did not say that there is a 'problem' with dotnetcore, it is a problem that dotnetcore is facing - there is a difference - do not misconstrue my comments. Second, I didn't downvote your answer, but whoever it was did so with good reason - your code is littered with security vulnerabilities and legacy functions which have no place in modern code. Most importantly, since this exact same issue existed in EF4 and SQL Server 2008 it is not a new issue. There are other, in fact better, solutions out there if you were a bit more resourceful and objective about your problem solving.

UPDATE: Since EF Core 2.2 there is support for spatial data!:

Eli, tnx for you're solution. For me it was almost the perfect solution. I had 2 problems:

Problems

  1. An other application also inserts directly into the database (temporary solution, this will be changed in the future).
  2. When getting the first 50 entities the data must be ordered by distance, so the 50 nearest entities will be returned.

Solutions

  1. Instead of updating the location table from code I use a trigger on my visit table. This trigger will fill or insert, delete or update the Location table. So the create, update, delete function don't have to do anything else than saving the entity.
  1. The query for getting the first 50 must be a raw sql query, that will look like this:

CRUD

Read

Create

Update

Delete

The database models

I updated my answer with the CRUD function. I also updated the trigger, it's now 1 trigger for update, insert and delete.

Hi Can you please show your visit model ? does it contains Latitude and Longitude as doubles you use Geography in code first ?

These solutions work but if you are looking for additional ways here is another solution. Since EF core 2 does not support geography types at this time you can use NetTopologySuite for all you server side geography support.

When you have a table that needs a geography column add property that EF can map to your table that either has type byte[] or string. Like so:

As you can see nothing special is going on here. This code in place you should have Full CRUDS. If you need geography support on the db side as well (like our team did) then you can create a calculated column that uses this data to generate the correct geography type like so:

EF will ignore this calculated column and you will be able to use it db side. Now this does leave use to how you would handle spatial queries and that is left to the reader. There are a number of ways to handle it and some of the answers above show some of them. It is worth noting if the query is small you could do it in memory with NetTopologySuite, since the library provides support for unions, intersections, etc.

tsklab

Да. Хотя не понятно, как вы используете наименование и число цикла одновременно? Я бы для номера кнопки использовал свойство .tag.

Какие вообще есть способы бекапа Windows 10? И какие инструменты вы можете порекомендовать?

tsklab

Я использую отдельный физический диск и настраиваю резервное копирование на него. Сначала создается полная копия системного раздела, а потом только разница. При заполненности этого диска удаляются самые старые копии Соответственно и восстановится можно на любую дату. Я говорю про штатную систему.

5a8e6b616712e506829791.jpg

MSSQL, как включить подсказки при вводе кода/команд?

tsklab

Как слить строки в таблице в одну строку, у которых совпадают определённые столбцы?

tsklab

Как на одном языке, вызвать функцию написанную на другом?

tsklab

tsklab

%date:~6,4%-%date:~3,2%-%date:~0,2%
Например, запускать cmd-файл много раз в день, но выполнять только в первый раз (используется флаг 2018.02.19.done):


echo %date:~6,4%-%date:~3,2%-%date:~0,2%|clip В буфер обмена.

Как научиться переводить на русский язык документацию по фреймворкам, CMS и др.?

tsklab

tsklab

5a89a4f218140384596011.jpg

Как(откуда) читать SQL-запросы?

tsklab

Поступайте так же, как и с исходными текстами программ: разбивайте на меньшие куски используя представления (view) и вычисляемые поля в таблицах. Например, сложный поиск можно разделить на 2 представления: для поиска и результата (сам запрос будет коротким):

Как решить проблему?

tsklab

5a89c206e32ee493202226.jpg

Папка с bpl, должна быть в переменной среды %Path%.

Обычно пакеты исполнения копируются в %SystemRoot%\SYSTEM32.

Присмотрелся: Delphi 7 не работает выше Windows XP.

tsklab

5a8949a2e8d38230920988.jpg

Выключите:

Как сохранить состояние HTML-страницы/данные на ней, чтобы иметь возможно на нее вернуться?

tsklab

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

Планировщик с целями, задачами, подзадачами задач, а так же подзадачами подзадач?

tsklab

Но, в Outlook нет возможности создать задачу с чек боксами, при чем саму задачу закрепить в какую-то категорию.

Вы понимаете, что это MS Office? Зачем вы пытаетесь заменить простое сложным? Можно написать макрос, который будет считать галочки и устанавливать процент выполнения. А можно просто вложить одну задачу в другую. А про категории — это вообще за гранью — нажать большую кнопку "Выбрать категорию" (естественно с добавлением и неограниченным количеством).

Java DB – это система управления реляционными базами данных, основанная на языке программирования Java и SQL. Это релиз Oracle проекта Apby Software Foundation с открытым исходным кодом Derby. Java DB включена в Java SE 7 SDK.

Пользовательский тип (UDT) – это класс Java, экземпляры (объекты) которого хранятся в столбцах таблицы базы данных. UDT определяются как тип данных столбца, а экземпляры UDT хранятся как значения столбца. UDT могут быть созданы и использованы в базе данных Java DB.

Ниже приводится содержание этого поста:

  1. Пользовательский тип (UDT)
  2. Создать и использовать UDT
  3. Проектирование UDT – рассмотрение влияния обновления UDT на существующие данные
  4. Пример кода
  5. Примечания и ссылки

1. Пользовательский тип (UDT)

UDT определяет тип данных в базе данных. UDT – это класс Java с модификатором открытого доступа. Этот класс реализует интерфейс java.io.Serializable. Класс должен быть виден в пути к классам приложения базы данных (или инструмента), ссылающегося на класс.

Класс UDT используется для определения типа данных таблицы или столбца представления – определенного пользователем типа данных. Данные UDT – это экземпляр (объект Java) класса UDT; и сохраняется как данные столбца. UDT также может упоминаться в хранимых процедурах и функциях (в Java DB они основаны на Java) как типы данных.

1.1. Атрибуты (характеристики)

  • UDT может иметь подтипы; и данные подтипа могут быть заполнены основным типом, то есть экземпляр подкласса класса UDT может быть заполнен как значение UDT. Например: (a) Java-класс Type1 и UDT, определенный в базе данных как dbtype1 , (b) Java-класс Subtype1 является подклассом Type1 , и (c) столбец таблицы dbtype1 также может быть заполнен экземпляром Subtype1 (в дополнение к экземплярам Type1 ).
  • UDT нельзя индексировать, упорядочивать или сравнивать; и не может использоваться с операторами, сгруппированными или агрегированными в выражениях SQL (например, =, LIKE, DISTINCT, GROUP…).

2. Создайте и используйте UDT

  • 2.1. Создать UDT
  • 2.2. Использование UDT

2.1.Создать UDT

Создайте класс Java и определите UDT в базе данных. Создайте класс Java, например TestType1.java (см. Код по адресу: 4.1 TestType1.java ), который будет использоваться в качестве UDT в базе данных. Скомпилируйте исходный код.

В локальной базе данных есть таблицы, и типы столбцов этих таблиц являются UDT, по этой причине в облаке созданы одни и те же UDT и таблицы с использованием этих UDT.

Но при попытке их синхронизации отображается ошибка, не поддерживающая UDT. Значит, я что-то упустил или есть обходной путь для синхронизации с UDT?

Здесь, если SQL Azure позволяет создавать UDT, а также позволяет создавать таблицы с использованием этих типов данных, то почему бы не разрешить синхронизацию?

задан 03 июля '12, 13:07

Если механизм синхронизации Azure вообще не допускает UDT, возможно ли создать пакет служб SSIS поверх локальной базы данных и выполнить синхронизацию через этот пакет служб SSIS с базой данных Azure, и эта синхронизация должна быть двусторонней? - shan

2 ответы

К сведению, «SQL Azure» теперь называется «База данных SQL», поэтому, если вы найдете ссылку на «Базу данных SQL» Windows Azure, вы также можете рассмотреть вопрос о применении к вашему требованию.

База данных SQL не поддерживает определяемые пользователем типы данных, расширенные свойства, проверку подлинности Windows или инструкцию USE.

Однако Обновление для SQL Server 2010 R2008 за ноябрь 2 г. включает поддержку базы данных SQL.. Мастер создания сценариев теперь позволяет создавать сценарии для версии базы данных SQL Database, поэтому сгенерированные сценарии напрямую совместимы для выполнения в базе данных SQL. Сгенерированные таким образом сценарии совместимы с базой данных SQL и могут быть скомпилированы в базе данных SQL без каких-либо дополнительных модификаций. Таким образом, ваш UDDT или пользовательские типы данных могут быть перенесены в базу данных SQL с помощью этого сценария миграции.

Если ваша база данных предшествует SQL Server 2008, вы можете использовать раздел «Миграция схемы с пред-SQL Server 2008 R2» из этой статье.

Создан 03 июля '12, 19:07


Спасибо за повтор, но я не хочу менять определяемый пользователем тип данных локальных таблиц базы данных, поэтому ищу решение для синхронизации набора данных Azure с UDDT. - шань

к сожалению, в настоящее время нет обходного пути. Служба синхронизации данных в значительной степени основана на Sync Framework и также не поддерживает UDT. Однако служба синхронизации данных поддерживает типы пространственных данных в последнем выпуске.

Создан 04 июля '12, 11:07

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками sql azure ssis dataset sync or задайте свой вопрос.

Читайте также: