Как я могу наследовать, используя TPT, используя EntityFramework из разных представлений? - PullRequest
0 голосов
/ 29 января 2019

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

// Table Meeting 
Id
Description
// other properties ...

// Attendee 
Id 
Name
MeetingId
// other properties ...

У меня есть два представления, которые сопоставлены с этими таблицами.Одним из них является ViewMeetings только с данными собрания, другие ViewMeetingAttendees объединены с участниками.

Я хочу использовать таблицу для каждого типа (TPT), отображая каждую таблицу в представление.

public abstract class MeetingBase 
{
    // Some properties here
}

public class ViewMeeting : MeetingBase
{ 
}

public class ViewMeetingAttendee : MeetingBase
{
      public String AttendeeName { get;set; }
}

// Configuration
moduleBuilder.Entity<ViewMeeting>().ToTable("ViewMeetings");
moduleBuilder.Entity<ViewMeetingAttendee>().ToTable("ViewMeetingAttendees");
// NOTE fixed the ViewMeeting error as stated in HansVG answer below.

Каждый разЯ пытаюсь запустить этот код, я получаю сообщение об ошибке Неверное имя столбца «Дискриминатор»

Я понимаю, что структура сущностей пытается разрешить типы в виде таблицы на иерархию (TPH).Тем не менее, я все еще хочу отобразить свойства, используя наследование без предполагаемого TPH.Это разумно, поскольку все столбцы одинаковы, кроме одного.У меня есть десять других столбцов и два представления.Кроме того, у меня есть один объект собрания, которому для большинства операций CRUD нужны одни и те же столбцы.

Есть ли способ сохранить наследование, но потерять ошибку дискриминатора?[NotMapped] не вариант, так как я все еще извлекаю данные из базы данных.Кроме того, я не предпочитаю объединять таблицы локально, используя LINQ, поскольку есть объединенные сущности, которые не должны отображаться иначе.

1 Ответ

0 голосов
/ 29 января 2019

Вы дважды определили ViewMeeting и не настроили ViewMeetingAttendee.Ваша конфигурация должна быть:

moduleBuilder.Entity<ViewMeeting>().ToTable("ViewMeetings");
moduleBuilder.Entity<ViewMeetingAttendee>().ToTable("ViewMeetingAttendees");
...