「Fluent NHibernate/フルーエントマッピング/自己参照」の版間の差分
ナビゲーションに移動
検索に移動
imported>Administrator (ページの作成:「Fluent NHibernateで自己参照を記述する方法。 == エンティティ == Parentプロパティが「protected set」となっている点が見どこ...」) |
imported>Administrator (→エンティティ) |
||
5行目: | 5行目: | ||
Fluent NHibernateの古いバージョンでは「private set」でも行けたようだが、最新バージョンではエラーとなるので注意すること。 | Fluent NHibernateの古いバージョンでは「private set」でも行けたようだが、最新バージョンではエラーとなるので注意すること。 | ||
+ | <source lang="csharp"> | ||
public class TreeNode | public class TreeNode | ||
{ | { | ||
17行目: | 18行目: | ||
} | } | ||
} | } | ||
+ | </source> | ||
== マッピング == | == マッピング == |
2012年7月8日 (日) 07:49時点における版
Fluent NHibernateで自己参照を記述する方法。
エンティティ
Parentプロパティが「protected set」となっている点が見どころ。 Fluent NHibernateの古いバージョンでは「private set」でも行けたようだが、最新バージョンではエラーとなるので注意すること。
public class TreeNode
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }
public virtual TreeNode Parent { get; protected set; }
public virtual IList<TreeNode> Childs { get; set; }
public TreeNode()
{
this.Childs = new List<TreeNode>();
}
}
マッピング
マッピングでの見どころはParentのカラム名を明示しているところ。 References関数で参照設定した場合、Column関数で明示しないと「TreeNode_Id1」など自動的にカラム名が割り振られ、あとから手動で追っかけれなくなるためである。
次に子ノード群をHasMany関数でリレーションであることを明示し、KeyColumn関数で引っ張ってくるキーを明示的に指定する。
public class CustomerMap : ClassMap<TreeNode> {
public CustomerMap() { Id(x => x.Id) // 自動インクリメントは.GeneratedBy.Increment()とよく間違うが // .GeneratedBy.Identity()が正解。実に紛らわしい。 // もしかするとDBエンジンによっては違うのかもしれない。未調査。 .GeneratedBy.Identity() ; Map(x => x.Name) .Not.Nullable() // NOT NULL .Length(255) // VARCHAR(255)となる。 // 長さに応じてVARCHARやTEXTは自動的に切り替わる。 ;
// 親ノードのカラム名を明示しておく References(x => x.Parent) .Column("ParentId") ;
// 子ノードたちは親ノード名をキーに引っ張ってくることを明示する HasMany(x => x.Childs) .Cascade.All() // 外部キー制約をつけて更新を連動させるようにしておく。地味に重要。 .KeyColumn("ParentId") // キーカラムを指定する。 ; }
}
関連項目
参考文献