Как работать с типом поля массива text[] в Npgsql?

У меня есть база данных Postgres 12 с одной таблицей:

CREATE TABLE public.messages
(
    sender text COLLATE pg_catalog."default",
    "timestamp" timestamp with time zone,
    message_id bigint,
    text text COLLATE pg_catalog."default",
    priority bigint,
    parameters text[] COLLATE pg_catalog."default"
)

Теперь, когда я хочу использовать эту таблицу в приложении .NET Winforms (не .NET Core), щелкнув правой кнопкой мыши проект, добавить новый элемент, модель данных сущности ADO.NET, EF Code First из базы данных, настроить мое соединение (успешно проверка соединения), выбирая свою таблицу, я получаю эту ошибку:

Код серьезности Описание Предупреждение о состоянии подавления строки файла проекта. Ошибка 6005. Тип данных «_text» в настоящее время не поддерживается для целевой версии Entity Framework; столбец «параметры» в таблице «test.public.messages» был исключен. Логтест D:\Projekte\LogTest\Model1.cs 1

Поле parameters не попало в класс сообщений:

[Table("public.messages")]
public partial class message
{
    public long id { get; set; }
    public string sender { get; set; }
    public DateTimeOffset? timestamp { get; set; }
    public long? base_message_id { get; set; }
    public string text { get; set; }
    public long? priority { get; set; }
}

Помимо parameters, модель работает и я могу получить данные из БД. Когда я пытаюсь добавить свойство вручную, оно все еще работает, но параметры всегда равны нулю:

    public string[] parameters { get; set; } // also tried List<string>

Как я могу заставить его работать? Из того, что я понимаю при чтении документов, я думаю, что это должно быть возможно?

Мое приложение предназначено для .NET Framework 4.6, я использую EntityFramework6.Npgsql версии 6.4.1.0 с Npgsql версии 4.0.10.0.


person Rob    schedule 18.02.2020    source источник


Ответы (1)


Сопоставление массивов не поддерживается в EF6 и, вероятно, никогда не будет — модель типов EF6 очень закрыта/ограничена и не позволяет отображать типы, специфичные для базы данных (и особенно не сложные случаи, такие как массивы).

Поставщик EF Core имеет довольно хорошую поддержку массивов PostgreSQL, и если они занимают центральное место в том, что вы делаете, я бы предложил вместо этого рассмотреть Core.

person Shay Rojansky    schedule 18.02.2020
comment
Хорошо, спасибо за разъяснение, похоже, я ошибся. Я посмотрю на .Net Core. - person Rob; 18.02.2020
comment
Просто обратите внимание, что .NET (Core/Framework) и EF (Core/6) — это не одно и то же: вы можете запускать EF6 в .NET Core, и вы можете запускать EF Core в .NET Framework (на данный момент, но не в следующем). версия). - person Shay Rojansky; 18.02.2020