У меня есть следующая структура данных:
+---------+
|Resume |
+---------+
|Id (PK) |
|IsActive |
|... |
|.. |
|. |
+---------+
+--------------------+
|Resume_Translation |
+--------------------+
|ResumeId (PK, FK) |
|Language (PK) |
|Title |
|Description |
|... |
|.. |
|. |
+--------------------+
Таким образом, у меня могут быть такие данные с двумя объединенными таблицами:
+----------------------------------------------------------+
|Id | IsActive | ResumeId | Language | Title | Description |
+----------------------------------------------------------+
|1 | true | 1 | 'fr' | 'One' | 'One desc' |
|1 | true | 1 | 'pl' | 'Raz' | 'Raz Opis' |
|2 | true | 2 | 'fr' | 'B' | 'bla bla' |
|3 | true | 3 | 'fr' | 'C' | 'C bla bla' |
+----------------------------------------------------------+
С точки зрения моего домена, я забочусь только о Resume
сущности. Я не хочу иметь Resume
сущность с ее коллекцией Resume_Translations
, потому что у меня будет только одна Resume
сущность с текущим переводом.
public class Resume
{
public virtual int Id{ get; protected internal set; }
public virtual string Language { get; protected internal set; }
public virtual string Title { get; protected internal set; }
public virtual string Description { get; protected internal set; }
public virtual bool IsActive { get; protected internal set; }
}
Мое текущее сопоставление с Fluent NHibernate выглядит следующим образом:
public class ResumeMap : ClassMap<Resume>
{
public ResumeMap()
{
Table("Resume");
Id(x => x.Id);
Map(x => x.IsActive);
// other properties
Join("Resume_Translation", m =>
{
m.Fetch.Join();
m.Map(x => x.Language).Length(5);
m.Map(x => x.Title).Length(100);
m.Map(x => x.Description).Length(200);
});
}
}
Я могу получить то, что хочу, из хранилища без проблем, просто передав WHERE предикат Id Resume и язык, который я хочу.
Однако у меня есть некоторые проблемы со вставкой и обновлением значений.
У меня такой вопрос: как определить отображение, которое NHibernate вставляет новую запись только в таблицу Resume_Translation вместо обновления записи для текущей сущности?
Так что я хочу достичь, если у меня есть в базе данных следующая запись:
|2 | true | 2 | 'fr' | 'B' | 'bla bla' |
Объединение подходит для отношений один к одному между таблицами, поэтому, если я включу это в свою сущность и поменяю язык и перевод, nhibernate выполняет обновление, и я могу это понять. Если я пытаюсь добавить новую сущность с тем же Id другим языком и переводом, nhibernate выдает ошибку, что ключ уже существует, и я тоже это понимаю.
Так что, конечно, я иду по неверному пути, но если кто-нибудь подскажет мне правильное решение о том, как я могу добиться нужного отображения, я был бы очень признателен.
Другой вопрос, как вы относитесь к сущностям и их переводам с точки зрения бизнеса?
Заранее спасибо за помощь.
Thomas