NHibernate 2个FK以一对一的关系连接到同一PK

NHibernate 2个FK以一对一的关系连接到同一PK,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我在信封和交易之间有一对一的关系。我使用主键关联将其映射如下: 根据您的要求,您可以: 编写一个存储过程来执行insert,并将NHibernate配置为在映射中使用此过程。在处理未使用但必须填充的遗留DBs和历史字段时,我采用了这种方法 使用一个。以下几点应该行得通。不过还没测试过 public class TransactionEntityInterceptor : EmptyInterceptor { public override boolean OnSave(object e

我在信封和交易之间有一对一的关系。我使用主键关联将其映射如下:


根据您的要求,您可以:

  • 编写一个存储过程来执行insert,并将NHibernate配置为在映射中使用此过程。在处理未使用但必须填充的遗留DBs和历史字段时,我采用了这种方法

  • 使用一个。以下几点应该行得通。不过还没测试过

    public class TransactionEntityInterceptor : EmptyInterceptor
    {
    
    
      public override boolean OnSave(object entity,
                      object id,
                      object[] state,
                      string[] propertyNames,
                      IType[] types)
      {
          if (entity is Transaction)
          {
              Object TransactionID;
              for ( int i=0; i<propertyNames.Length; i++ )
              {
                  if ( "TransactionID" == propertyNames[i] )
                  {
                      TransactionID = state[i];
                      return true
                  }
              }
    
              for ( int i=0; i<propertyNames.Length; i++ )
              {
                  if ( "OLD_DEPRECATED_TXN_ID" == propertyNames[i] )
                  {
                      state[i] = TransactionID;
                      return true;
                  }
              }
              return false;
          }
          else
          {
              return true;
          }
      }
    } 
    
    公共类TransactionEntityInterceptor:EmptyInterceptor
    {
    公共覆盖布尔OnSave(对象实体,
    对象id,
    对象[]状态,
    字符串[]属性名称,
    IType[]类型)
    {
    if(实体为交易)
    {
    对象事务ID;
    
    对于(int i=0;i您的问题不太清楚..您能制作两个表-Transaction和Envelope,并在它们下面显示它们的列,然后告诉我们它们之间的预期关联吗?很抱歉,我的问题不清楚。实际上这是一个非常简单的设置:您有一个表,其中两个外键指向同一个表的主键另一张桌子。我希望我的例子能更好地解释问题。谢谢。我希望有一种更“自动”的方式。谢谢。
    T_ENVELOPE
    ----------
    ENVELOPE_ID
    1
    9
    121
    
    T_TRANSACTION
    -------------
    TRANSACTION_ID | OLD_DEPRECATED_TXN_ID
    1|1
    9|9
    121|121
    
    public class TransactionEntityInterceptor : EmptyInterceptor
    {
    
    
      public override boolean OnSave(object entity,
                      object id,
                      object[] state,
                      string[] propertyNames,
                      IType[] types)
      {
          if (entity is Transaction)
          {
              Object TransactionID;
              for ( int i=0; i<propertyNames.Length; i++ )
              {
                  if ( "TransactionID" == propertyNames[i] )
                  {
                      TransactionID = state[i];
                      return true
                  }
              }
    
              for ( int i=0; i<propertyNames.Length; i++ )
              {
                  if ( "OLD_DEPRECATED_TXN_ID" == propertyNames[i] )
                  {
                      state[i] = TransactionID;
                      return true;
                  }
              }
              return false;
          }
          else
          {
              return true;
          }
      }
    }