NHibernate无法解析属性“类”

时间:2013-12-17 15:29:00

标签: c# nhibernate inheritance

我遇到了问题,花费的时间告诉我,请问stackOverflow社区。所以: 我有基本的版本控制系统,文件表示为抽象类FileSystemEntry(FSE),它有2个子项 - 文件和文件夹。还有FileSystemEntryVersion(FSEV)。 FSE有很多FSEV。

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”表示无法解析。为什么?

1 个答案:

答案 0 :(得分: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>();