2

プライベートコレクションを使用せずに流暢な NHibernate を使用して 1 - 0..1 (1 対最大 1 \ 1 対 0 または 1) の関係をマッピングできるかどうかを調べようとしています。クラス構造の例を以下に示します。

    public class ClassA
    {
        public int ClassAId { get; set; }

        public string SomeDetails { get; set; }

        public ClassB ClassB { get; set; }

    }

    public class ClassB
    {
        public ClassA ClassA { get; set; }

        public int ClassBId { get; set; }

        public string SomeChildDetails { get; set; }
    }

この例では、ClassA が ClassB を持つことも、ClassB が null になることもあります。

DB 構造は次のようになります。

   ClassA Table
   -------------
   int ClassA_ID  PK
   string SomeDetails

   ClassB Table
   ------------
   int ClassA_Id   PK  FK
   string SomeChildDetails

この場合、HasOne(x => x.ClassB).Cascade.All(); は使用できません。これは、常に1つ持っている必要があると想定しているためです。

ClassA のプライベート IList と 1 対多の関係を持たず、ClassB プロパティのゲッターがリストの最初のエントリを取得することなく、これを行う方法はありますか。

R

4

1 に答える 1

3

マッピングのすべてのプロパティを としてマークすることとは別にvirtualReferences次のトリックを行う必要があります。

References(x => x.ClassB).Nullable().Cascade.All();

Fluent NHibernate のドキュメントには、これは多対 1 の関係と同等であると書かれていますが、単一のプロパティでも機能し、最終的に 1-0..1 の関係になります。HasOnewithNullable()修飾子を試すこともできますが、代わりに一般的に使用する必要があるとドキュメントに記載されていますReferences

[コメントを編集]:

私が覚えている限りではkeyname_id、NHibernate のデフォルトの外部キー命名ポリシーは です。これは、独自に実装することで変更できますForeignKeyConvention(これはすべてのマッピングに適用されます)。外部キー ポリシーが TableNameID であるとします。これは「ClassBID」になります。

internal class MyFkeyConvention : ForeignKeyConvention
{
    protected override string GetKeyName(FluentNHibernate.Member property, Type type)
    {
        if(property != null)
            return property.Name + "ID";
        return type.Name + "ID";
    }
}

または、1 か所だけで必要な場合は、これを使用します。

References(x => x.ClassB).Column("YourForeignKeyColumnName").Nullable().Cascade.All();
于 2012-10-01T11:45:23.423 に答える