私は次のクラスによって表されるフォルダの階層があります。つまりFluent NHibernateを使用して自己参照フォルダ階層をマッピングするにはどうすればよいですか?
public class Folder
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Folder ParentFolder { get; set; }
public virtual ICollection<Folder> SubFolders { get; set; }
}
を、各Folder
はParentFolder
に属しているだけでなく、その下にSubFolders
を持つことができます。私はFluent NHibernateのAutomapper
を使用しており、SchemaExport
を使用して自動的にデータベーススキーマを生成しています。私はいくつかのテストのフォルダを保存しようとすると、私は次の表を得る:
Id | Name | ParentFolder_id | Folder_id
----------------------------------------------------------------
1 | Root Folder (has children) | NULL | NULL
2 | Root Folder (no children) | NULL | NULL
3 | Sub Folder | 1 | NULL
4 | Sub Sub Folder | 2 | NULL
これまでのところは良い、それは別のFolder_id
列を作成した理由を私は知らないが、ParentFolder_id
列は、正しく設定されています。返されるカウントが0である
using (var session = SessionFactory.OpenSession())
{
// I'm using NHibernate 3
var rootFolder = session.Query<Folder>()
.Where(x => x.Name.StartsWith("root").First();
Console.WriteLine(rootFolder.SubFolders.Count());
}
、および以下のSQLが実行されています:今、ときに私は、次のコードを実行しようと
SELECT count(Id) FROM [Folder] WHERE Folder_id = 1
このSQL文が間違っています。これは、やるべきこと:
SELECT count(Id) FROM [Folder] WHERE ParentFolder_id = 1
流暢NHibernateのは、余分なFolder_id
列を作成し、それを照会し、それが適切に代わりParentFolder_id
列を照会するように私はそれを修正することができますどのようにしている理由誰も私に言うことはできますか?私は幸運で次のオーバーライドを試しました:
public class FolderOverride : IAutoMappingOverride<Folder>
{
public void Override(AutoMapping<Folder> mapping)
{
mapping.HasMany(x => x.SubFolders).Inverse(); // I thought inverse might fix it, but no dice
mapping.References(x => x.ParentFolder);
}
}
あなたは流暢NHのどのバージョンを実行していますか?限り、私は言うことができる、これは、バージョン1.1のままでサポートされる必要があります:http://fluentnhibernate.lighthouseapp.com/projects/33236/tickets/115-self-referencing-relationships –
私は頭を使用しています数日前の体幹の –