这是基于遗留系统。
我有以下表格:
CREATE TABLE a
id int
CREATE TABLE b
a_id int,
c_id int
relationshipid int -- must be IN (1, 2, 3)
CREATE TABLE c
id int
我想要以下域名模型
public class A
{
public int Id { get; set; }
public C entityc { get ; set; }
}
public class C
{
public int Id { get; set; }
}
表b的设置使得对于特定的已定义的关系,存在(嗯,应该只)一对id。对于其他关系,通过B的一对一映射不成立。 Relationshipid可以是少数值之一。
如何使用流畅的NHIbernate从关系数为1的关系中将实体C转换为A类?
作为一个附带问题,我在这里尝试做的是否有名称?最初的方法是尝试使用带有连接表的HasOne并过滤结果,但显然失败了。
编辑:澄清了RelationshipID和目的。
答案 0 :(得分:0)
我认为最简单的映射方法是让你的表b成为一个实体,并在该实体中引用A和C,并将RelationshipId引用为id。所以你的映射看起来像这样:
public class A
{
public int Id { get; set; }
public IList<B> bEntities { get; set; }
}
public class ClassAMap : ClassMap<A>
{
public AMap()
{
Table("A");
Id(x => x.Id);
HasMany(x => x.bEntities)
.KeyColumns.Add("a_id");
}
}
public class B
{
public virtual int RelationshipId { get; set; }
public virtual A InstanceA { get; set; }
public virtual C InstanceC { get; set; }
}
public class ClassBMap : ClassMap<B>
{
public BMap()
{
Table("B");
Id(x => x.RelationshipId , "relationshipid");
References(x => x.InstanceA);
References(x => x.InstanceC);
}
}
修改:
如果您想要将A实体中B实体集合的这些结果过滤为仅匹配RelationshipId = 1的实体,那么您应该看一下这篇文章:
Fluent NHibernate and filtering one-to-many relationship on query requiring multiple joins?
您也可以在班级A中执行类似的操作:
public class A
{
public int Id { get; set; }
public IList<B> bEntities { get; set; }
public C InstanceC
{
get { return bEntities.First<B>(x => x.RelationshipId == 1).InstanceC; }
}
}