Свободный выбор 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
в соответствующие им свойства или поля. "