Каков наилучший способ использования NHibernate для объектов без идентификатора? - PullRequest
2 голосов
/ 14 апреля 2010

В моем приложении есть классы, для которых не требуется сохранение идентификатора. Это могут быть такие вещи, как пользовательские журналы или записи аудита. Я могу добавить к ним произвольный идентификатор, но я бы хотел этого избежать, поскольку они ничего не значат.

Для извлечения этих объектов всегда используется другой ключ (например, UserId), который не уникален для записи.

Ответы [ 4 ]

5 голосов
/ 14 апреля 2010

Поскольку NHibernate имеет дело с сущностями, у вас должно быть что-то, что идентифицирует сущность. Лучше всего иметь отдельное уникальное поле идентификатора, так как NHibernate предназначен для работы, и с ним намного проще не бороться.

Однако, если у вас есть конструктивные ограничения, в которых вы не можете иметь отдельный столбец идентификатора, вы можете использовать составной идентификатор, определенный в существующих полях. Например, для записи журнала аудита вы можете использовать комбинацию UserId и DateTime. Если записи пишутся только один раз и никогда не манипулируются (например, журнал аудита), вы также должны добавить mutable = false к отображению класса, чтобы обеспечить это. Кроме того, помните, что если вы действительно используете составной идентификатор, подобный этому, это может вызвать проблемы, если вы когда-нибудь попробуете использовать некоторые из более продвинутых функций NHibernate с этим объектом в будущем.

2 голосов
/ 14 апреля 2010

Я не думаю, что вы можете избежать этого. Детали NHibernate со «сущностями», а не со строками базы данных и сущностями, имеют идентичность.

Подумайте, что произойдет, если вы прочитаете некоторые из этих записей, измените их и попытаетесь их сохранить. NHibernate не будет знать, какую строку базы данных изменить. Конечно, вы не собираетесь делать это в вашем случае, но это именно то, для чего предназначен NHibernate.

Таким образом, вам нужно либо создать искусственный идентификатор, либо просто сохранить их без использования NHibernate (т. Е. С помощью прямого SQL, который вы можете запустить через объект NHibernate ISession, если хотите). Если пространство базы данных действительно имеет значение (т. Е. У вас их будет миллионы), я бы порекомендовал последний способ, в противном случае добавить искусственный идентификатор довольно просто.

1 голос
/ 14 апреля 2010

У вас должен быть идентификатор в какой-либо форме. В моих проектах я просто использую составной идентификатор во всех полях сущности или в любом другом месте, где ваш составной ключ находится в базе данных.

1 голос
/ 14 апреля 2010

Если вы хотите иметь возможность выполнять операции CRUD с этими записями в будущем, вы можете пересмотреть поле идентификатора.

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