Я застрял при создании сопоставления для двух сущностей, которые должны быть сопоставлены с одной и той же таблицей базы данных. Причина, по которой мне это нужно, состоит в том, чтобы создать облегченную сущность и полную сущность, которые будут использоваться в разных случаях У меня уже была база данных, и у меня есть собственный контекст базы данных, производный от класса 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-запрос как можно более легким. Иногда мне интересно, важно это или нет? Может быть, моя просьба не будет легче, даже если я выплюнул свою сущность. Может быть, стоит попытаться объединить все мои свойства в одну сущность и забыть об этом.