Отображение NHibernate без идентификатора - PullRequest
9 голосов
/ 15 июня 2009

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

Я пытаюсь вызвать хранимую процедуру, используя

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

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

Ответы [ 4 ]

4 голосов
/ 02 августа 2012

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

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

<composite-id>
  <key-property name="Property1" column="Column1"/>
  <key-property name="Property2" column="Column2"/>
</composite-id>
3 голосов
/ 20 октября 2009

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

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

1 голос
/ 19 сентября 2013

Из сообщения @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();
    }
}
0 голосов
/ 16 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...