2010-11-26 10 views
3

は、私は2つのクラス(は、例えばを簡素化)を持っています。 DataクラスはDataContainerについては認識しませんが、DataContainerの外部に存在することはできません。私はこのためにHasManyの関係を使用します。hasManyのNOT NULL外部キー

Id(x => x.Id); 
HasMany<Data>(x => x.DataPoints) 
    .Not.KeyNullable() 
    .Cascade.All(); 

とデータ用に生成されたSQLは、次のようになります:

は、私はこのようなデータコンテナをマッピング

create table [Data] (
    [Id] INT IDENTITY NOT NULL, 
    [DataContainer] INT null, 
    primary key ([Id]) 
) 
alter table [Data] 
    add constraint FK173EC9226585807B 
    foreign key ([DataContainer]) 
    references [DataContainer] 

問題は、私はしたくないということです[データコンテナ] INTヌル代わりに、nullを許可しないようにします。

[DataContainer] INT not null 

私は.Not.KeyNullable()がこれを行うと思ったが、うまくいかないと思った。

ありがとうございました。

+0

あなたはUSI流暢のバージョンは何ですng? – Phill

+0

@Phil、ごめんなさい、あなたのコメントを見ただけです... Fluent 1.1とNHibernate 2の使用。1.2。 – row1

答えて

2

私はまったく同じマッピングと同じ結果を持っていますが、Fluentによって生成されたhbm.xmlを見れば、ここでできることはそうであるように見えます。コレクション・マッピングは、(「鍵」要素の「ヌルではない」属性を注意してください)、次のようになります。

<bag cascade="all" name="Items" mutable="true"> 
    <key foreign-key="FK_MyEntity2_MyEntity1" not-null="true"> 
    <column name="MyEntity1_Id" /> 
    </key> 
    <one-to-many class="MyNs.MyEntity2, MyAssembly, Version=0.4.700.0, Culture=neutral, PublicKeyToken=null" /> 
</bag> 

。したがって、私は、これはNHibernateは問題ではなく、流暢な問題だと思います。最新のNHibernateリファレンスの章6.4から取得され、次の(3.0.0が、私は同じことが2.1.2のために真であるかなり確信している)

非常に重要な注意:もし関連の<キー>コラムNOT NULLと宣言された場合、NHibernateは、関連付けを作成または更新するときに制約違反を引き起こす可能性があります。この問題を回避するには、inverse = "true"とマークされた多くの値のある端(セットまたはバッグ)との双方向の関連付けを使用する必要があります。この章で後述する双方向の関連付けの説明を参照してください。

は、だから私の推測では、NHibernateのは、単純にこのマッピングのためのDDLを生成「 - nullでない」属性を無視し、溶液が上記の提案として、アソシエーション双方向を作ることであると(間違いなく動作しますが、あなたのシナリオに合わないかもしれないということです)、またはNULLカラムを使用しています。

+0

私はまったく同じ問題を抱えていて、上で示唆したように解決しようとしました(双方向関係を追加し、コンテナの終わりをInverseに設定しました)が、私の外部キーはまだnullです。誰かが解決策について詳細を教えてもらえますか? –

+0

私はあなたの答えに私のコメントで書いています:useReferences()。Not.Nullable()。 – Yhrn

0

私は同じマッピングを持ち、(Yhrnにより示唆されるように)関係の双方向をすることによってそれを解決してから制約を(追加することによって、外部キー制約を施行している)のForeignKey()宣言のマッピングには:。

this.HasOne(x => x.DataContainer).Cascade.All().Constrained().ForeignKey(); 

生成されたSQLの列がまだNULL可能であるが、外部キーが追加されています:データクラスで

ALTER TABLE [dbo].[Data] WITH CHECK ADD CONSTRAINT [FK_DataToDataContainer] FOREIGN KEY([Id]) 
REFERENCES [dbo].[DataContainer] ([Id]) 
GO 

ALTER TABLE [dbo].[Data] CHECK CONSTRAINT [FK_DataToDataContainer] 
GO 
+0

こんにちは、HasOneはここでは使用しないでください。それは1対1の関係のためだけに意味され、これは1対多の関係です。代わりに、References()。Not.Nullable()を使用します。 – Yhrn

+0

あなたが作成したこのマッピングは、DataContainerごとに1つのデータのみをサポートします。 Dataテーブルのプライマリキーは、DataContainerテーブルへの外部キー、つまり、共有プライマリキーとの厳密な1対0/1関係です。 – Yhrn