Как отобразить две сущности в одну таблицу базы данных с помощью Entity Framework (сначала код для существующей базы данных)? - PullRequest
2 голосов
/ 03 мая 2019

Я застрял при создании сопоставления для двух сущностей, которые должны быть сопоставлены с одной и той же таблицей базы данных. Причина, по которой мне это нужно, состоит в том, чтобы создать облегченную сущность и полную сущность, которые будут использоваться в разных случаях У меня уже была база данных, и у меня есть собственный контекст базы данных, производный от класса DbContext. Все сопоставления были сделаны с использованием EntityTypeConfiguration<T> классов.

Таблица.

[PROCESS]
ProcessId <int> PK
Name <nvarchar>
StartDate <datetime>
ProcessSequency <int>
Limit <int>
OwnerName <nvarchar>

Теперь эта таблица сопоставлена ​​с моделью одного домена, но я хочу ее изменить. Я хочу разделить эту сущность на следующие две.

public class ProcessEntity
{
    public int ProcessId { get; set; }
    public int Name { get; set; }
    public virtual ProcessDetailsEntity ProcessDetails { get; set; }
}

public class ProcessDetailsEntity
{
    public int ProcessId { get; set; }
    public DateTime StartDate { get; set; }
    public int ProcessSequency { get; set; }
    public int Limit { get; set; }
    public string OwnerName { get; set; }
    public virtual ProcessEntity ProcessBase { get;set; }
}

Я создал два класса конфигурации для них.

public class ProcessEntityConfiguration : EntityTypeConfiguration<ProcessEntity>
{
    public ProcessEntityConfiguration()
    {
        // ToTable("PROCESS");
        Map(m => m.ToTable("PROCESS"))
        HasKey(t => t.ProcessId);
        HasRequired(s => s.ProcessDetails).WithRequiredPrincipal(t => t.ProcessBase);
    }
}

public class ProcessDetailsEntityConfiguration : EntityTypeConfiguration<ProcessDetailsEntity>
{
    public ProcessDetailsEntityConfiguration()
    {
        // ToTable("PROCESS");
        HasKey(t => t.ProcessId);
        Map(m => m.ToTable("PROCESS"));
    }
}

Все выглядит нормально и должно работать, но я вижу ошибку:

"InnerException": { «Сообщение»: «Произошла ошибка.», «ExceptionMessage»: «Неверное имя столбца« Дискриминатор ». \ R \ nНеверное имя столбца« Дискриминатор ».», "ExceptionType": "System.Data.SqlClient.SqlException", "StackTrace": "at System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, Boolean breakConnection, Action`1 wrapCloseInAction)

Я прогуглил его и обнаружил, что Discriminator используется Entity Framework для применения TPH - Таблица для иерархии поведения. Я также нашел одну полезную статью, которая могла бы стать для меня решением: Entity Framework - расширенные сценарии сопоставления . К сожалению, решение, которое предоставляется в Отображение одной таблицы в несколько объектов header, не работает для меня, и я не знаю почему. Не могли бы вы помочь мне с этим вопросом?

Я немного знаком с NHibernate, поэтому я попытался сделать это NHibernate. Идея состоит в том, чтобы создать две независимые организации. Это был мой первый подход. Вот код этой попытки.

public abstract class ProcessBaseEntity
{
    public int ProcessId { get; set; }
    public int Name { get; set; }
}

public class ProcessEntity : ProcessBaseEntity
{
}

public class ProcessDetailsEntity : ProcessBaseEntity
{
    public DateTime StartDate { get; set; }
    public int ProcessSequency { get; set; }
    public int Limit { get; set; }
    public string OwnerName { get; set; }
}

public class ProcessEntityConfiguration : EntityTypeConfiguration<ProcessEntity>
{
    public ProcessEntityConfiguration()
    {
        ToTable("PROCESS");
        HasKey(t => t.ProcessId);
    }
}

public class ProcessDetailsEntityConfiguration : EntityTypeConfiguration<ProcessDetailsEntity>
{
    public ProcessDetailsEntityConfiguration()
    {
        ToTable("PROCESS");
        HasKey(t => t.ProcessId);
    }
}

К сожалению, эта попытка не удалась. Было сгенерировано следующее исключение:

Типы сущностей ProcessEntity и ProcessDetailsEntity не могут совместно использовать таблицу «ПРОЦЕСС», потому что они не находятся в одной иерархии типов или не имеют действительного отношения внешнего ключа с одним сопоставление первичных ключей между ними.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...