我有以下数据结构:NHibernate的连接两个表为一个实体与复合键
+---------+
|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; }
}
我用流利的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谓词的标识,我想语言至。
但是,我插入和更新值有一些问题。
我的问题是:我如何定义一个映射,NHibernate插入一个新的记录只在Resume_Translation表中而不是更新当前实体的记录?
所以我想实现的是,如果我有在数据库中有如下记载:
|2 | true | 2 | 'fr' | 'B' | 'bla bla' |
加入有利于表之间一对一的关系,所以如果我得到这个在我的实体,我改变语言和翻译,nhibernate正在执行更新,我可以理解它。如果我尝试通过不同的语言和翻译添加具有相同标识的新实体,则nhibernate会产生一个错误,即某个键已经存在,我也理解它。
所以,当然我会走错路,但如果有人能指出我正确的解决方案,我如何能够实现我想要的映射,我将不胜感激。
另一个问题,你如何从商业角度处理实体和他们的翻译?
非常感谢您的帮助。
Thomas
嗨托马斯,我有同样的问题,但我不喜欢那个解决方案。我正在尝试做与你发布的相同的内容,并且在我看来这更公平更优雅。任何与此? – RMalke