2010-11-23 16 views
8

Aşağıdaki sınıf tarafından temsil edilen bir klasör hiyerarşisi var:Kendi kendini referans alan bir klasör hiyerarşisini eşleştirmek için Fluent NHibernate'i nasıl kullanırım?

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; } 
} 

Diğer bir deyişle, her Folder bir ParentFolder'ye ait olabilir, ayrıca SubFolders'ün altında olabilir. Fluent NHibernate'in Automapper kullanıyorum ve SchemaExport kullanarak otomatik olarak veritabanı şemasını oluşturuyorum. Bazı test klasörlerini kaydetmeye çalıştığımda aşağıdaki tabloyu alırım:

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 

Şimdiye kadar çok iyi, ParentFolder_id sütunu doğru ayarlanıyor, ancak neden başka bir Folder_id sütunu yaratıldığını bilmiyorum. Şimdi, aşağıdaki kodu çalıştırmayı denediğimde:

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()); 
} 

Geri döndürülen sayı 0'dır ve aşağıdaki SQL çalıştırılır:

SELECT count(Id) FROM [Folder] WHERE Folder_id = 1 

Bu SQL deyimi yanlıştır. Yapması gereken:

SELECT count(Id) FROM [Folder] WHERE ParentFolder_id = 1 

Herkes Fluent NHibernate'in neden fazladan Folder_id sütun oluşturduğunu ve üzerinde sorgulama yaptığını ve bunun yerine ParentFolder_id sütununu düzgün şekilde sorgulayabilmesi için bunu nasıl düzeltebileceğini söyleyebilir mi? Şanssız olarak aşağıdaki geçersiz kılmayı denedim:

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

Hangi akıcı-NH sürümünü kullanıyorsunuz? Anlayabildiğim kadarıyla, bu sürüm 1.1'den itibaren desteklenmelidir: http://fluentnhibernate.lighthouseapp.com/projects/33236/tickets/115-self-referencing-relationships –

+0

Kafayı kullanıyorum Birkaç gün önce bagajın. –

cevap

8

Haritalama geçersiz kılmalarınızdaki sütunları belirtmeniz gerekecek.

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

Teşekkürler, bunu yaptı. Sadece ilişkinin iki tarafını aynı sütunu kullanıyordum: 'mapping.HasMany (x => x.SubFolders) .KeyColumn (" ParentFolder_id ");' ve 'mapping.References (x => x.ParentFolder)) .Column ("ParentFolder_id"); '. –

İlgili konular