Свободный выбор NHibernate без уникального идентификатора

Я пытаюсь отобразить представление без идентификатора, но nhibernate все еще генерирует sql с столбцом id (давая мне ошибку sql, так как столбец ID не существует в db). Может быть, я недопонимаю конструктор Id()?

комментарий конструктора:

Создайте идентификатор, который не имеет соответствующего свойства в объекте домена, или столбец в базе данных. Это в основном для использования с доступом только для чтения и/или представления. По умолчанию используется идентификатор int с генератором "increment".

public class PersonMapping : ClassMap<Person>
{
    public PersonMapping()
    {
        Table("person");
        ReadOnly();

        Id();
        Map(f => f.Name, "name");
    }
}

Ответы

Ответ 1

NHibernate требует идентификатор. Метод doc говорит, что он создает идентификатор, который не имеет соответствующего свойства в объекте домена, однако в базе данных все еще есть идентификатор.

Если у вас нет поля в таблице, чтобы пометить его как идентификатор (должен быть уникальным..), возможно, вы можете попытаться определить некоторые столбцы, которые могут быть составлены в виде составного идентификатора.

Дано, например, простая таблица ссылок, которая связывает некоторый int с другим int, например

A | B
-----
1 | 2
1 | 3
2 | 2

вы можете использовать Composite ID, если все комбинации A/B уникальны.

public PersonMapping()
{
    [...]
     CompositeId()
         .KeyProperty(x => x.A)
         .KeyProperty(x => x.B);
    [...]
}

Ответ 2

Вы можете извлекать записи как объекты значений (не управляемые объекты) вместо объектов.

" 14.1.5. Возвращение не управляемых объектов

Можно применить IResultTransformer к исходным SQL-запросам. Разрешить его, например, возвращать не управляемые объекты.

sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
    .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO)))

Указанный запрос:

  • строка запроса SQL
  • трансформатор результата

Вышеприведенный запрос вернет список CatDTO, который был создан и ввел значения NAME и BIRTHNAME в соответствующие им свойства или поля. "