2011-01-31 6 views
0

私は2つのテーブルのBuildGroupとテーブルDocumentTemplateを持っています。 DocumentTemplateテーブルには、NULL可能な外部キーとしてBuildGroupIdがあります。特定のシナリオでは、DocumentTemplateテーブルのBuildGroupIdを更新します。私は DBNull.Valueを再びDocumentTemplateテーブルにBuildGroupIdを設定する必要が別のsenarioでNhibernateを使用してNull値に外部キーを更新する

public bool EditDocTempForBldGrp(int docId, int bldGrpId) 
    { 
     try 
     { 
      using (ISession session = Document.OpenSession()) 
      { 
       using (ITransaction transaction = session.BeginTransaction()) 
       { 
        HSDocumentTemplate objDocBO = new HSDocumentTemplate(); 

        objDocBO = GetDocumentDetailsById(docId); 
        HSBuildGroup objBldGrp = new HSBuildGroup(); 

        if (bldGrpId != 0) 
        {        
         objBldGrp.Id = bldGrpId; 
        } 
        else 
        { 
         //int ? bldid = null; 
         //objDocBO.HSBuildGroup.Id = null; 
         //objDocBO.HSBuildGroup.Id = DBNull.Value; 
         //objDocBO.HSBuildGroup.Id = -1; 

        } 
        objDocBO.HSBuildGroup = objBldGrp; 
        session.Update(objDocBO); 
        transaction.Commit(); 
       } 
      } 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      return false; 
     } 

    } 

。私は、他のブロックと異なるケースで試しました。それはエラーを与えます: 暗黙の型 'System.DBNull'を 'int'に変換できません。 外部キーの値をNULLで更新するにはどうすればよいですか?どんな助けもありがとう。

答えて

2

少数の観察:

  • あなたはHSBuildGroupオブジェクトにIDを割り当て、その代わりbldGrpIdは0
  • のことができない場合たSession.load()を介してインスタンスをロードしてはなりません次のようにドキュメントのビルドグループをヌルに設定してください:

    objDocBO.HSBuildGroup = null;

    NHibernateは残りの部分を処理します。

希望します。

1

Kay Herzamが言ったようにSession.Loadとnullを使用します。

session.Loadを呼び出すためには、ドキュメントが存在することを確認する必要があります。例:のようなものを実行します

public bool EditDocTempForBldGrp(int docId, int bldGrpId) 
{ 
    try 
    { 
     using (ISession session = Document.OpenSession()) 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      session.Get<HSDocumentTemplate>(docId).HSBuildGroup 
         = bldGrpId = 0 ? null : session.Load<HSBuildGroup>(bldGrpId); 
       transaction.Commit(); 
     } 
    } 
} 

この方法のNHibernateは、

select ... from DocumentTemplate where DocId = ..; 
UPDATE DocumentTemplate SET .... , BuildGroupId = null where DocumentId = XX; 

または

select ... from DocumentTemplate where DocId = ..; 
UPDATE DocumentTemplate SET .... , BuildGroupId = YY where DocumentId = XX; 

は、データベースへのBuildGroupのための選択はありません。

ビルドグループの存在がわからない場合、あなたのコードは次のようになります。この方法ではNHibernateのは、何かのように実行します

public bool EditDocTempForBldGrp(int docId, int bldGrpId) 
{ 
     try 
     { 
      using (ISession session = Document.OpenSession()) 
      using (ITransaction transaction = session.BeginTransaction()) 
      { 
       session.Get<HSDocumentTemplate>(docId).HSBuildGroup 
         = session.Get<HSBuildGroup>(bldGrpId); 
       transaction.Commit(); 
      } 
     } 
} 

select ... from DocumentTemplate where DocId = ..; 
SELECT .... FROM BuildGroup where buildgroupid = ZZ; 
UPDATE DocumentTemplate SET .... , BuildGroupId = null where DocumentId = XX; 

は、自動的に取得する場合はnullを返しますオブジェクトは存在しません。

最後に、Session.Update()を呼び出す必要はありません。エンティティを再接続するためです。トランザクションにコミットすると、セッションに関連するすべてのものがフラッシュされます。

+0

私はあなたが小さなエラーを持っていると思います:それはsession.Get (docId)であるべきではありません.HSBuildGroup = bldGrpId == 0? null:session.Load (bldGrpId); –

関連する問題