Могут ли NHibernate, Subsonic или L2S делать автоинкремент для каждой сущности? - PullRequest
0 голосов
/ 17 декабря 2009

У меня есть база данных SQL Server 2008 с составным ключом: ProjectID (GUID) и TaskID (int). ProjectID - это внешний ключ к таблице Projects. Я хочу, чтобы TaskID автоматически увеличивался, но перезапускался для каждого ProjectID (то есть: каждый projectID должен иметь 1,2,3, ... в качестве TaskID).

Насколько мне известно, это невозможно в SQL Server "из коробки", и мне нужна хранимая процедура. Теперь, прежде чем я углублюсь в это, я задаюсь вопросом, могу ли я вместо этого сделать это на моей стороне ORM? Я не определился между NHibernate 2.1.2 и Subsonic 3.0, но даже Linq-To-SQL - вариант (Entity Framework - нет), если это возможно с ним.

Я знаю, что могу просто написать этот код вручную, и я знаю, что почти наверняка "SELECT max (TaskID) FROM Tasks", ГДЕ ProjectID = @projectID "необходим в любом случае, но если я могу избежать этого и вместо этого иметь ORM сделай это, это было бы неплохо.

Я не нашел ничего в их соответствующих документах, но я действительно не знаю, есть ли подходящий термин для этого сценария?

1 Ответ

1 голос
/ 17 декабря 2009

Есть причина, по которой это трудно - и мне неприятно звучать так, но этот дизайн не очень хорошая идея. У нас с Ореном действительно было это обсуждение (суррогатные ключи и почему вы должны их использовать) - привязывание значения к вашему ПК навредит вам почти всегда.

Пусть ваш индексатор будет вашим индексатором, пусть ваш FK будет вашим FK. Отдайте ПК автокоррекции и дайте ему сделать свою работу. Простые победы.

Я бы предложил триггер (GASP!) Или, возможно, отдельную подпрограмму для вставок, которую вы можете запустить, которая запускает обновление для вновь вставленной записи.

Или вы можете использовать фьючерсные вещи NHib (или пакет SubSonic или CodingHorror), чтобы он выполнялся сразу.

Но, пожалуйста, для детей - составные ключи - это дьявол.

...