2013-12-17 65 views
1

我有問題和時間花蜜卡告訴我,問stackoverflow社區。所以: 我有基本的版本控制系統的文件表示爲抽象類FileSystemEntry(FSE),它有2個孩子 - 文件和文件夾。還有FileSystemEntryVersion(FSEV)。 FSE有許多FSEV。NHibernate無法解決propery「class」

public abstract class FileSystemEntry 
{ 
    public FileSystemEntry(){} 

    public virtual long Id { get; protected set; } 

    public virtual IList<FileSystemEntryVersion> Versions { get; set; } 
} 

這裏是FSEV:

public class FileSystemEntryVersion { 
    public FileSystemEntryVersion(){} 

    public virtual long Id { get; protected set; } 

    public virtual String Name { get; set; } 

    //pointer to physical file/folder 
    public virtual FileSystemEntry FileSystemEntry { get; set; } 

    //pointer to parent file/folder 
    public virtual FileSystemEntry ParentFolder { get; set; } 
} 

這裏是FSE的hbm.xml文件中(最重要的部分)

<class name="FileSystemEntry" table="[FileSystemEntry]" abstract="true"> 
<id name="Id" type="Int64"> 
    <generator class="identity" /> 
</id> 

<discriminator column="Type" 
       not-null="true" 
       type="String"/> 
<subclass name="File" 
      discriminator-value="File"/> 

<subclass name="Folder" 
      discriminator-value="Folder"/> 
</class> 

每個FSEV(有父文件夾)。我想做一個查詢,它只獲取包含在父文件夾中的文件夾。我當前的查詢是:

IList<FileSystemEntryVersion> versions = 
       session.CreateCriteria<FileSystemEntryVersion>() 
         .Add(Restrictions.Eq("ParentFolder.Id", parentFolderId)) 
         .Add(Restrictions.Eq("FileSystemEntry.class", typeof(Folder))))) 
         .List<FileSystemEntryVersion>(); 

      return versions; 

但FileSystemEntry.class中的屬性「class」被稱爲無法解析。爲什麼?

+0

你有沒有嘗試過這樣的:http://stackoverflow.com/questions/17283070/nhibernate-query-by-discriminator-on-association – Najera

+0

@Najera是的,我做了。但得到同樣的例外,直到我試圖這樣別名:CreateAliast(「FileSystemEntry」,「FileSystemEntry」)...但我不確定它爲什麼突然工作:) Radim科勒明確表示,但我發誓,我試了一下,它昨天沒有工作:D現在它確實.. – Milanec

回答

1

你幾乎有:

var versions = session 
    .CreateCriteria<FileSystemEntryVersion>() 
    .Add(Restrictions.Eq("ParentFolder.Id", parentFolderId)) 

    // we do need a reference here, JOIN in fact, 
    // to include the Many-to-One table   
    .CreateAlias("FileSystemEntry ", "Entry") 

    // now the SELECT will contain even the FileSystemEntry table 
    // and can start evaluate 
    .Add(Restrictions.Eq("Entry.class", typeof(Folder))))) 
    .List<FileSystemEntryVersion>(); 
+0

非常感謝!就是這樣:)但是正如我對納傑拉說的那樣,我以爲我嘗試了它,但它沒有奏效。現在確實如此。從布拉格到布拉格的問候:) – Milanec

+0

很酷,如果有幫助;)與NHibernate祝你好運。這是驚人的工具;) –