3

この例のために簡略化した次の db テーブルがあります。

Web ページID、URLIdentifier

WebpageMetaData Webpage_id キーワード

Webpage_id は、テーブルの主キーであり、Web ページ テーブルへの外部キーです。

次に、Fluent NHibernate とその自動マッピング機能を使用して、これらを次の POCO クラスにマップします。

public class Webpage
{
    public virtual int Id { get; set; }
    public virtual string UrlIdentifier { get; set; }
    public virtual WebpageMetaData WebpageMetaData { get; set; }

}

public class WebpageMetaData
{
    public virtual int Id { get; set; }
    public virtual string Keywords{ get; set; }
    public virtual Webpage Webpage { get; set; }

}

これらのエンティティを 1 対 1 でマッピングしたいので、次のように自動マッピングをオーバーライドします。

public class WebpageMap : IAutoMappingOverride<Webpage>
{        
    public void Override(AutoMapping<Webpage> mapping)
    {
        mapping.HasOne(w => w.WebpageMetaData)
            .Not.Constrained()
            .Fetch.Join()
            .Cascade.All();
    }
}

public class WebpageMetaDataMap : IAutoMappingOverride<WebpageMetaData>
{
    public void Override(AutoMapping<WebpageMetaData> mapping)
    {
        mapping.Id(w => w.Id, "Webpage_id").GeneratedBy.Foreign("Webpage");

        mapping.HasOne(w => w.Webpage)
            .ForeignKey("Webpage_id")
            .Constrained()
            .Fetch.Join()
            .Cascade.None();
    }
}

これらのマッピングとカスケード ルールをテストしたところ、選択、挿入、更新に使用できます。ただし、WebpageMetaData の削除を実行すると、例外が発生します。

「削除されたオブジェクトはカスケードによって再保存されます (関連付けから削除されたオブジェクトを削除します)[WebpageMetaData#524]」

例外を停止する唯一の方法は、保存する前に次の操作を行うことです。

webpageMetaData.Webpage.WebpageMetaData = null;

したがって、親から自分自身への null 参照を設定する必要がありますか??! これは間違っているようですか?マッピングが間違っていますか?

ありがとう。

更新 1: FLuent が生成している NH マッピングを参照してください。ハードコアな NHibernator の助けになる場合があります:)

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" name="EveryPage.Core.Domain.Webpage, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Webpage`">
    <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
      <column name="Id" />
      <generator class="identity" />
    </id>
    <one-to-one cascade="all" class="EveryPage.Core.Domain.WebpageMetaData, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" constrained="false" fetch="join" name="WebpageMetaData" />
    <property name="UrlIdentifier" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="UrlIdentifier" />
    </property>    
  </class>
</hibernate-mapping>


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" name="EveryPage.Core.Domain.WebpageMetaData, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`WebpageMetaData`">
    <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
      <column name="Webpage_id" />
      <generator class="foreign">
        <param name="property">Webpage</param>
      </generator>
    </id>
    <one-to-one cascade="none" class="EveryPage.Core.Domain.Webpage, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" constrained="true" fetch="join" foreign-key="Webpage_id" name="Webpage" />
    <property name="Keywords" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Keywords" />
    </property>
  </class>
</hibernate-mapping>
4

2 に答える 2

1

あなたのマッピングは完全に正しくないと思います。NH ドキュメントを見ると、親子関係に 1 対 1 を使用する例には、多対 1 マッピング (unique=true を使用) と 1 対 1 マッピングが含まれます。 1 対 1 のマッピングのペア。(1 対 1 のマッピングのペアは、共有 PK を使用して 2 つのテーブルが関連付けられている場合に使用されます)

マッピングを例に合わせて変更し、カスケードが修正されるかどうかを確認することをお勧めします。

于 2010-01-05T01:01:43.703 に答える
0

うーん、カスケード-すべて削除-孤児かもしれませんか?

于 2010-01-13T17:30:46.817 に答える