如何使用Fluent NHibernate配置以下连接?

时间:2011-04-14 13:19:15

标签: fluent-nhibernate

这是基于遗留系统。

我有以下表格:

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和目的。

1 个答案:

答案 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; }
    }
}