2013-04-19 3 views
0

У меня есть взаимно-однозначная связь между конвертом и транзакцией. Я замэпили с использованием первичного ключа ассоциации, как показано ниже: NHibernate 2 FKs к одному и тому же PK в отношениях один к одному

<class name="Envelope" table="T_ENVELOPE"> 
    <id name="EnvelopeId" column="ENVELOPE_ID"><generator class="identity"/></id> 
    <one-to-one class="Transaction" cascade="all" name="Transaction" /> 
</class> 
<class name="Transaction" table="T_TRANSACTION"> 
    <id name="TransactionID" column="TRANSACTION_ID" type="long"><generator class="foreign"><param name="property">Envelope</param></generator></id> 
    <one-to-one name="Envelope" class="Envelope" constrained="true" /> 
</class> 

Это прекрасно работает, но мое дело осложняется, так как T_TRANSACTION имеет 2 FKs, что обе карты в T_ENVELOPE's PK (ENVELOPE_ID): TRANSACTION_ID (как показано выше) и OLD_DEPRECATED_TXN_ID. Итак, у меня есть 2 FKs в T_ENVELOPE, которые имеют то же самое значение (идентификатор конверта). Как я могу сделать NHibernate сэкономить ENVELOPE_ID не только в TRANSACTION_ID, но и в OLD_DEPRECATED_TXN_ID?

Желаю, чтобы у меня не было этого требования, но я имею дело с устаревшими схемами кода и кодом. Я знаю, что я могу сделать что-то вроде:

  1. envelope.Save // ​​это экономит конверт и транзакции идентификатор транзакции, но не OLD_DEPRECATED_TXN_ID
  2. envelope.transaction.old_deprecated_txn_id = envelope.id
  3. envelope.Save Но , что приводит к одной вставке и одному обновлению. Как мне сделать только одну вставку?

Вот пример:

T_ENVELOPE 
---------- 
ENVELOPE_ID 
1 
9 
121 

T_TRANSACTION 
------------- 
TRANSACTION_ID | OLD_DEPRECATED_TXN_ID 
1|1 
9|9 
121|121 
+0

Ваш вопрос не очень понятно .. Вы можете сделать две таблицы - Сделку и Envelope и показать свои колонны под ними, а затем сказать нам, что ожидаемая связь между ними? – mridula

+0

Прошу прощения, мой вопрос непонятен. На самом деле это очень простая настройка: у вас есть одна таблица с двумя внешними ключами, указывающими на один и тот же первичный ключ другой таблицы. Надеюсь, мой пример лучше объясняет. Благодарю. – MrTibs

ответ

0

В зависимости от ваших требований вы можете:

  1. написать хранимую процедуру для выполнения вставки и настройки NHibernate использовать эту процедуру в отображениях. Я использовал этот подход при работе с устаревшими БД и историческими полями, которые не использовались, но их необходимо было заполнить.

  2. Используйте Interceptor. Что-то в следующих строках должно работать. Не проверено!

    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; 
         } 
        } 
    } 
    
+0

Я надеялся, что есть более «автоматический» способ. Благодарю. – MrTibs

Смежные вопросы