2011-06-21 13 views
6

私は1対1マッピングを使用する際に問題があります。私はインターネットを検索し、多くの解決策を見つけましたが、満足できるものはありませんでした。ほとんどの例では、子インスタンスに親インスタンスを格納するオーバーヘッドが発生します。NHibernate One-To-One

外部キー制約の関係を持つ子クラスで親Idだけを使用したいが、子インスタンスに親インスタンスを保持したくない。

データベースからレコードをロードしようとすると、「指定された識別子の行が存在しません[AssemblyName。]」という例外がスローされます。しかし、表Bのレコードは適切に存在します。

この問題の解決方法はありますか?

クラス構造:

class A { 
public virtual string Id {get;set;} 
public virtual B B {get;set;} // properties...... } 

class B { public virtual string Id {get;set;} // properties...... 
public virtual string ParentId { get;set;} // class A Id } 

データベース構造:

CREATE TABLE [A]( 
    [Id] [nvarchar](45) PRIMARY KEY 
) ON [PRIMARY] 

CREATE TABLE [B]( 
    [Id] [nvarchar](45) PRIMARY KEY, 
    [ParentId] [nvarchar](45) NOT NULL 
) ON [PRIMARY] 

マッピング:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
<class name="A,AssemblyName" table="A" lazy="true"> 
<id name="Id" column="Id" type="string"> 
<generator class="assigned"/> 
</id> 
<one-to-one name="_B" cascade="all" fetch="join" foreign-key="None" constrained="true" class="B"/> 
</class> 
</hibernate-mapping> 


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
<class name="B,AssemblyName" table="B" lazy="true"> 
<id name="Id" column="Id" type="string"> <generator class="assigned"/> </id> 
<property name="_Name" column="Name"/> </class> 
</hibernate-mapping> 

答えて

4

1対1の関連付けは、常にNHibernateでは双方向です。クラスBのマッピングが不完全です。

<class name="B,AssemblyName" table="B" lazy="true"> 
    <id name="Id" column="Id" type="string"> 
     <generator class="assigned"/> 
    </id> 
    <many-to-one name="A" unique="true" column="A" /> 
    <property name="_Name" column="Name"/> 
</class> 

これは外部キー関連です。詳細については、thisのAyendeのブログ記事またはNHibernate documentationを参照してください。

+0

また、これまでの記事で述べたように、これは不満足な解決策の1つです。とにかく、ありがとう。 – ni3a

+0

これまでの投稿は? –

0

読むthis。 「本当の」1対1の場合、両方のテーブルで同じプライマリキーが必要です(ParentId列はありません)。