Не возвращается значение ключа из столбца Identity после вставки новой строки с помощью SubSonic ActiveRecord

Я уверен, что здесь мне не хватает очевидного ответа, но я мог бы воспользоваться рукой. Я новичок в SubSonic и использую версию 3. Я дошел до такой степени, что могу запрашивать и вставлять, но я застрял в том, как мне вернуть значение столбца идентификаторов после моей вставки. Я видел еще один пост, в котором упоминались шаблоны Linq. Я не использую их (по крайней мере, я не думаю, что использую ...?)

TIA

... ОБНОВИТЬ ...

Итак, я отлаживал свой код, наблюдая, как работает код SubSonic, и обнаружил, что столбец отступов игнорируется. Я использую int в качестве типа данных для столбцов идентификаторов в базе данных и устанавливаю их в качестве идентификаторов. Поскольку int - это тип данных, не допускающий значения NULL в C #, логический тест в методе Add (public void Add (поставщик IDataProvider)), который проверяет, есть ли значение в ключевом столбце, выполняя (key == null), может быть проблема. Код, который получает новое значение для поля идентификатора, находится в «истинном пути», поскольку int не может быть нулевым, и я использую целые числа в качестве типов данных столбца идентификатора, этот тест никогда не пройдет. В поле идентификатора моего объекта стоит 0, которого я не указывал. Я предполагаю, что он установлен во время инициализации объекта. Я здесь за пределами базы? Есть ли ответ изменить мои типы данных в базе данных?

Другой вопрос (больше из любопытства). Я заметил, что некоторые свойства в сгенерированных классах объявлены с помощью символа? после типа данных. Я не знаком с этой конструкцией объявления ... что дает? Некоторые из них объявлены как int (неключевые поля), а другие объявлены как int? (ключевые поля). Это как-то связано с тем, как они обрабатываются при инициализации?

Любая помощь приветствуется!

--УДАР--


person Mike Devenney    schedule 21.05.2010    source источник


Ответы (3)


Не могу вам сильно помочь с первой частью вашего вопроса. Вероятно, вам следует создать для этого шаблон T4, как описано здесь:

Как я могу получить значение столбца идентификатора, связанное с вставкой SubSonic 3 LinqTemplate?

Знак "?" который вы обнаружите после объявления int, относится к типу, допускающему значение NULL:

http://msdn.microsoft.com/en-en/library/1t3y8s4s(VS.80).aspx

Это в основном означает, что свойство может быть нулевым.

person mamoo    schedule 25.05.2010

У меня это работает, я использую точно такую ​​же настройку:

Account account = new Account();
account.EmailAddress = emailAddress;
account.Identity = identifier;
account.IsActive = true;
account.Save();

int accountId = account.AccountId; // AccountId being an identity column.

В этом примере нет обработки ошибок, но вы меня поняли.

person Rebecca    schedule 01.06.2010
comment
Я согласен с тем, что то, что я делаю, должно работать, но когда он попадает в эту строку в методе добавления (if (key == null)), где он проверяет, является ли значение ключа нулевым, переменная ключа всегда равна 0, без учета если это новая запись или нет. - person Mike Devenney; 02.06.2010

В дополнение к моему предыдущему ответу; целочисленное значение не может быть нулевым. Это целое число, потому что столбец базы данных является первичным ключом, и поэтому он не должен быть нулевым по определению. Значение по умолчанию для целого числа, не допускающего значения NULL, равно 0. Просмотреть значения по умолчанию в C #

Ссылка Mamoo на типы, допускающие значение NULL, также заслуживает упоминания. Поэтому ваш модульный тест должен проверять значение 0 в случае сбоя или больше 0 в случае успешного прохождения.

person Rebecca    schedule 07.06.2010
comment
Спасибо, Хунто, у меня проблема с логикой, используемой для определения новой записи и необходимости создания нового ключа. Если вы перейдете к любому из ваших сгенерированных классов и найдете метод Add с этой подписью - public void Add (поставщик IDataProvider) - и проследите там логику, вы увидите, что он извлекает значение ключа для класса, сравнивает его с нулем и если это так (чего никогда не произойдет, потому что это int, не допускающий значения NULL), он генерирует новое значение ключа для записи. В противном случае он сохраняет значение 0 и не выполняет вставку. Я уверен, что у меня последняя сборка, что-то не хватает? - person Mike Devenney; 08.06.2010
comment
Может быть, для поддержки нецелочисленных первичных ключей? Значение строки по умолчанию - null. У меня такое же телосложение, как и у вас, и я понимаю, что вы имеете в виду. В случае целого числа ключ никогда не может быть нулевым: var key = KeyValue (); если (ключ == ноль) {var newKey = _repo.Add (это, провайдер); this.SetKeyValue (newKey); } else {_repo.Add (это, поставщик); } - person Rebecca; 08.06.2010
comment
Кстати, сегодня у меня были похожие проблемы (например, неудачная вставка). Я понял, что забыл установить идентификационную вставку в столбце первичного ключа одной из моих таблиц. Даже после того, как я повторно запустил специальный инструмент, изменения не были сохранены. Мне пришлось удалить весь сгенерированный код и шаблоны Subsonic перед закрытием и повторным открытием решения для хорошей меры. После копирования шаблонов обратно в решение идентификационная вставка заработала. - person Rebecca; 08.06.2010