2013-12-17 4 views
1

У меня возникла проблема, и время, потраченное на то, что мне нужно, говорит мне, чтобы спросить сообщество stackOverflow. Итак: У меня есть базовая система управления версиями для файлов, представленных в виде абстрактного класса FileSystemEntry (FSE), который имеет 2 дочерних элемента - файл и папку. Существует также FileSystemEntryVersion (FSEV). FSE имеет много FSEV.NHibernate не смог решить «класс»

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

Вот файл hbm.xml для FSE (наиболее важная часть)

<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 сказано, что не может быть решена. Зачем?

+0

Вы пробовали это: http://stackoverflow.com/questions/17283070/nhibernate-query-by-discriminator-on-association – Najera

+0

@Najera Да, я сделал , Но получилось такое же исключение, пока я не попытался сделать псевдоним таким образом: CreateAliast («FileSystemEntry», «FileSystemEntry») ... но я не был уверен, почему это работает внезапно :) Radim Kohler установил это ясно, но я клянусь, я попробовал, и он вчера не работал: 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. Это потрясающий инструмент;) –

Смежные вопросы