2009-06-15 2 views
9

Возможно ли сделать сопоставление в NHibernate без использования Id?Отображение NHibernate без Id

То, что я пытаюсь сделать, это, вызов хранимой процедуры с помощью

session.CreateSqlQuery(myQuery).AddEntity(typeof(MyEntity)); 

Процедура представляет собой совокупность и нет поля Id возвращаются, но я все же хотел бы воспользоваться отображением NHibernate данные возвращаются в объект. Единственное, что я придумал до сих пор, заключается в том, что процедура добавляет поле «O as Id» или что-то еще, и у объекта есть поддельное поле Id.

ответ

3

Я нашел это действительно невозможным. Данные, возвращаемые из хранимой процедуры, также должны иметь идентификатор. Он работал над созданием фиктивного столбца с идентификатором и фиктивным свойством объекта, но я просто решил преобразовать данные, возвращаемые NHibernate, в объект вручную.

В принципе, вы не должны использовать хранимые процедуры с NHibernate. Это ORM afterall. В моем случае у меня не было выбора, кроме как использовать эту процедуру.

0

Мне нужно дважды проверить xsd, но я считаю, что требуется идентификатор или составной идентификатор. Однако, для документов, имя не требуется. Таким образом, вы должны иметь возможность указать почти пустой раздел id.

В аналогичной ситуации я установил класс в mutable = "false" и сопоставил идентификатор с индексом строки и задал генератор в сопоставлении идентификатора для назначенного.

+1

Хорошо - немой вопрос. Как сопоставить индекс строки? Как это выглядит в файле сопоставления? Мы искали это в документации и решили спросить. – ferventcoder

4

Ваша сущность должна быть «уникальной» в некотором роде, даже если она не имеет поля идентификатора.

Решите, какие свойства, взятые вместе, должны быть уникальными, и использовать составной ключ над ними ...

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 
0

С поста @Andy McCluggage в:

Вы можете очень многое сделать это в отображение:

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 

Но вы должны переопределить Equals() и GetHashCode() в модели:

public class MyClass 
{ 
    public virtual DateTime Property1; 
    public virtual string Property2; 
    public virtual int SomeOtherProperty; 

    public override bool Equals(object obj) 
    { 
     if(obj == null) 
      return false; 

     var t = obj as MyClass; 

     if(t == null) 
      return false; 

     if (this.Property1 == t.Property1 && this.Property2 == t.Property2) 
      return true; 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return (this.Property1 + "|" + this.Property2).GetHashCode(); 
    } 
} 
Смежные вопросы