2009-04-21 15 views
3

私には、キャンペーンテーブルに関連するCampaignID列を持つ寄付テーブルがあります。この寄付にキャンペーンが使用されていない場合は、Nullの代わりにCampaignID列に0を挿入する必要があります。私は私が私の寄付エンティティのキ​​ャンペーンエンティティがnullであるかどうかをチェックし、データベースに保存する前にNHibernate nullの代わりに0から多対1の列を保存する

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true"> 
    <class name="Donation,Entities" lazy="true" table="Donations" dynamic-update="true" > 
     <id name="DonationID" column="PledgeID" type="Int64"> 
      <generator class="native" /> 
     </id> 
     <many-to-one name="FundraisingCampaign" class="Campaign, Entities" column="CampaignID" lazy="proxy" not-found="ignore" cascade="none" /> 

:寄付テーブルから

私のマッピングは次のようになります。もしそうなら、それを新しいキャンペーンエンティティに設定し、このようにCampaignID = 0を設定します。

if (null == donation.FundraisingCampaign) 
    { 
     donation.FundraisingCampaign = new Campaign() {CampaignID = 0}; 
    } 

問題は、私はにErrorMessage得るということである「オブジェクトが保存されていない一時的なインスタンスを参照します - 。フラッシュする前に、一時的なインスタンスを保存します」保存しようとすると。

私はカスケード= "none"があるため、キャンペーンテーブルに何も保存しようとするべきではないため、CampaignID以外の私のキャンペーンオブジェクトの何かを気にしません。

現在のシステムでは、Nullの代わりに0を設定しなければならないため、Nullを保存することはできません。

答えて

3

DBからDB IDが0のCampaignオブジェクトを読み込みます。それは完全永続オブジェクトになります。あなたはそれを設定し、寄付を持続させることができます。

これが機能する場合は、CampaignオブジェクトのIDプロパティマッピングを変更する必要があります。 Nhは、ここで作成した一時的なキャンペーンオブジェクトが次のとおりであると判断できません:

new Campaign() {CampaignID = 0}; 

は実際には切り離されたオブジェクトです。あなたがするべきことは、「保存されていない値」をあなたのマッピング-1に追加することです。 Nhは有効なデタッチされたキャンペーンとDB IDのIDが0であることと、Idが-1の一時的な新しいキャンペーンとの違いを知ることができます。次に、新しく作成したキャンペーンのIDを-1に設定します。

+0

私は私に保存されていない値を設定し-1、すべての私のコードは、新しいものを作成するために、-1にCAMPAIGNIDを設定するように更新。私は今Nullではなく私のCampaignIDに0を持っています。ありがとうございました。 – Adam

+0

nullableを使用する方が簡単でした。 –

2
  1. NHibernateは、主キーをチェックしてエンティティが既に格納されているかどうかを知っています。 0の場合は格納されません。この動作はマッピングで変更できます。
  2. エンティティを保存しようとすると、参照元のエンティティはすべてカスケードするか、すでに保存しておく必要があります。これは、Hibernateが外部キーを取るために重要です。それはあなたの記憶に外国キーを指すことはできません、それはデータベースにある必要がありますので、それは格納する必要があります。そうでない場合は、例外メッセージが表示されます。

この情報を使用すると、問題が発生した理由を理解する必要があります。

自動カウンタでCampaignIDが生成されていますか?とにかくそれは働かない。 (アプリケーションでIDを設定することはできません)CampaignID = 0のキャンペーンを保存しない限り(下記参照)。

CampaignIDをnull可能なintにすると、保存されていない値はデフォルトでnullになります。

あなたのデータベースにCampaignID = 0のキャンペーンがあることに注意してください。これは "Null Object"です。たとえば、データベースを設定した後など、データベースを格納する必要があります。

ヌルオブジェクトを避けたい場合は、問題が発生します。 NHibernateは概念的には外部キーにアクセスさせないで、あなたのためにそれを管理します。あなたはおそらく(例えば迎撃器の)いくつかのトリックをすることができますが、それは問題の価値がないと思います。また、外部キーの制約がないことを確認しなければなりません。これは良いことでもありません。

関連する問題