8

私は次のクラスによって表されるフォルダの階層があります。つまり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; } 
} 

を、各FolderParentFolderに属しているだけでなく、その下に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); 
    } 
} 
+0

あなたは流暢NHのどのバージョンを実行していますか?限り、私は言うことができる、これは、バージョン1.1のままでサポートされる必要があります:http://fluentnhibernate.lighthouseapp.com/projects/33236/tickets/115-self-referencing-relationships –

+0

私は頭を使用しています数日前の体幹の –

答えて

8

私はあなたのマッピングオーバーライドの列を指定する必要があると思います。

mapping.HasMany(x => x.SubFolders).KeyColumn("ParentFolder_id"); 
+0

ありがとう、それはそれをしました。関係の2つの側が同じ列を使用しているようにしなければなりません: 'mapping.HasMany(x => x.SubFolders).KeyColumn(" ParentFolder_id ");'および 'mapping.References(x => x.ParentFolder ).Column( "ParentFolder_id"); '。 –

関連する問題