Отображение структуры наследования в Entity Framework Core на Postgres - конфликтующие сообщения об ошибках - PullRequest
0 голосов
/ 03 марта 2020

У меня есть несколько иерархий наследования в моей модели. Я использую Entity Framework Core 3.1.2 с базой данных Postgres. Код первый. Я пытаюсь создать миграцию для генерации таблиц своей базы данных.

Я сопоставил свой первый абстрактный объект

public DbSet<Asset> Assets { get; set; }

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

The corresponding CLR type for entity type 'Asset' is not instantiable and there is no derived entity type in the model that corresponds to a concrete CLR type.

Итак, я сопоставляю потомков.

public DbSet<LinearAsset> LinearAssets { get; set; }
public DbSet<StructureAsset> Structures { get; set; }
public DbSet<BridgeAsset> Bridges { get; set; }
public DbSet<RoadAsset> Roads { get; set; }

и все хорошо. Fantasti c.

Однако. Когда я прихожу, чтобы отобразить свою вторую иерархию наследования (и любую другую, которую я пробую), я попадаю в этот странный круговой аргумент, где я и должен, и не должен отображать детей.

public DbSet<Attachment> Attachments { get; set; }
public DbSet<AssetAttachment> AssetAttachments { get; set; }

дает мне

The entity type 'AssetAttachment' cannot be mapped to a table because it is derived from 'Attachment'. Only base entity types can be mapped to a table.

Если я удалю сопоставление для AssetAttachments, я вернусь к этому

The corresponding CLR type for entity type 'Attachment' is not instantiable and there is no derived entity type in the model that corresponds to a concrete CLR type.

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

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

Может ли кто-нибудь дать мне несколько советов о том, как мне поступить два конфликтующих сообщения об ошибках?

1 Ответ

1 голос
/ 04 марта 2020

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        foreach (var entity in modelBuilder.Model.GetEntityTypes())
        {
            // THIS IS WHAT CAUSES THE ISSUE
            if (!String.IsNullOrWhiteSpace(entity.GetTableName()) && (entity.GetTableName() != entity.GetTableName().ToLower()))
                entity.SetTableName(ToSnakeCase(entity.GetTableName()));

            // THIS IS OKAY
            foreach (var property in entity.GetProperties())
            {
                property.SetColumnName(ToSnakeCase(property.GetColumnName()));
            }
        }
        base.OnModelCreating(modelBuilder);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...