C# NHibernate-通过不同键多个连接到同一个表

C# NHibernate-通过不同键多个连接到同一个表,c#,.net,nhibernate,nhibernate-mapping,C#,.net,Nhibernate,Nhibernate Mapping,另一个NHibernate连接问题 我试图将一个表中的两个不同属性通过两个不同的表连接起来 钥匙。 但我无法获取第二个JOIN属性 简化示例- 我的班级- namespace Domain { public class Message { #region private Members private string _id; private string _senderID; private string _recipientID;

另一个NHibernate连接问题

我试图将一个表中的两个不同属性通过两个不同的表连接起来 钥匙。 但我无法获取第二个JOIN属性

简化示例-

我的班级-

namespace Domain
{
   public class Message
   {
      #region private Members

      private string _id;
      private string _senderID;
      private string _recipientID;
      private string _recipientName;
      private string _senderName;

      #endregion

      #region Public Properties

      public virtual string ID
      {
          get { return _id; }
          set { _id = value; }
      }

      public virtual string ID
      {
          get { return _id; }
          set { _id = value; }
      }

      public virtual string SenderID
      {
          get { return _senderID; }
          set { _senderID= value; }
      }

      public virtual string RecipientID
      {
          get { return _recipientID; }
          set { _recipientID= value; }
      }

      public virtual string SenderName
      {
          get { return _senderName; }
          set { _senderName= value; }
      }

      public virtual string RecipientName
      {
          get { return _recipientName; }
          set { _recipientName= value; }
      }

      #endregion

      #region Constructors

      public Message()
      {
          _id = Guid.NewGuid().ToString();
      }

      #endregion
  } 
}
映射-

 <class name="Domain.Message" table="Messages" >
    <id name="ID">
      <column name="OID"/>
      <generator class="assigned"/>
    </id>
    <property name="SenderID" unique="true">
       <column name="SenderID" unique="true"/>
    </property>
    <property name="RecipientID" unique="true">
       <column name="RecipientID" unique="true"/>
    </property>
    <join table="CompanyData"  optional="true" >
       <key column="CompanyID" property-ref="SenderID" />
       <property name="SenderName" column="CompanyName" unique="true" lazy="false"/>
    </join>
    <join table="CompanyData"  optional="true" >
       <key column="CompanyID" property-ref="RecipientID" />
       <property name="RecipientName" column="CompanyName" unique="true" lazy="false"/>
    </join>
 </class>
我想要-

 SELECT  this_.OID as OID30_0_, this_.SenderID as Sender30_0_,
 this_.RecipientID as Recipient30_0_, this_1_.CompenyName as
 SiteID9_0_ , this_2_.CompanyName as SiteID10_0_
 FROM Messages this_
 left outer join CompanyData this_1_ on
 this_.SenderID=this_1_.CompanyID
 left outer join CompanyData this_2_ on
 this_.RecipientID=this_2_.CompanyID
我用的是NHibernate 3.2


感谢

显然,目前无法使用NHibenate映射实现这一点。
根据建议,最接近的解决方案是创建一个视图并将对象映射到该视图。

我整天都在互联网上寻找解决同一问题的方法。 我发现的是线。我接受了他的解决方案。所以,如果其他人对解决方案感到头疼,不想使用视图,我会发布我现在正在使用的代码

我必须在同一个表上使用1到12个连接,因此创建视图非常混乱

private void addParagraphsQuery(DetachedCriteria sourceQuery, List<ParagraphContentArgument> paragraphsArguments)
{
    DetachedCriteria dc;
    Conjunction conjunction = Restrictions.Conjunction();
    string alias = string.Empty;

    if (paragraphsArguments != null && paragraphsArguments.Count > 0)
    {
        for (int i = 0; i < paragraphsArguments.Count; i++)
        {
            alias = "p" + i.ToString();
            dc = DetachedCriteria.For<Document>().SetProjection(Projections.Id());
            dc.CreateAlias("paragraphList", alias);
            dc.Add(Restrictions.Eq(alias + ".paragraphSectionTemplate", paragraphsArguments[i].ParagraphTemplate));
            dc.Add(Restrictions.Like(alias + ".content", paragraphsArguments[i].Argument, MatchMode.Anywhere));
            conjunction.Add(Property.ForName("id").In(dc));
        }
    }
    sourceQuery.Add(conjunction);
}
private void addParagraphsQuery(DetachedCriteria源查询,列表段落段落段落)
{
分离标准dc;
连接=限制。连接();
字符串别名=string.Empty;
if(paragraphsArguments!=null&¶phsarguments.Count>0)
{
对于(int i=0;i
问候,


Mariusz

我看不出地图有什么问题。你也可以发布类代码吗?当你运行这个时,RecipientName是用什么填充的?SenderName值是多少?我倾向于认为这可能是一个错误。nHibernate可能试图为您进行错误的优化。是的,您是对的,RecipientName中填充了SenderName值。有什么我可以做的关闭优化?可能没有。虽然你并不是完全不走运。如果这个类应该是只读的,那么您可以轻松地创建一个视图,并让您的映射指向该视图。在Hibernate团队注意到这个问题之前,这至少是一个解决方法。我将使用视图映射选项。但下一次这种解决方案可能还不够。非常感谢。
private void addParagraphsQuery(DetachedCriteria sourceQuery, List<ParagraphContentArgument> paragraphsArguments)
{
    DetachedCriteria dc;
    Conjunction conjunction = Restrictions.Conjunction();
    string alias = string.Empty;

    if (paragraphsArguments != null && paragraphsArguments.Count > 0)
    {
        for (int i = 0; i < paragraphsArguments.Count; i++)
        {
            alias = "p" + i.ToString();
            dc = DetachedCriteria.For<Document>().SetProjection(Projections.Id());
            dc.CreateAlias("paragraphList", alias);
            dc.Add(Restrictions.Eq(alias + ".paragraphSectionTemplate", paragraphsArguments[i].ParagraphTemplate));
            dc.Add(Restrictions.Like(alias + ".content", paragraphsArguments[i].Argument, MatchMode.Anywhere));
            conjunction.Add(Property.ForName("id").In(dc));
        }
    }
    sourceQuery.Add(conjunction);
}