Не удается получить значение ключа из столбца Identity после вставки новой строки с SubSonic ActiveRecord - PullRequest
1 голос
/ 21 мая 2010

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

ТИА

... ОБНОВЛЕНИЕ ...

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

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

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

- BUMP -

Ответы [ 3 ]

0 голосов
/ 01 июня 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.

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

0 голосов
/ 07 июня 2010

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

Стоит также упомянуть ссылку Mamoo на обнуляемые типы. Для этого ваш юнит-тест должен быть равен 0 в случае сбоя или больше 0 в случае прохождения.

0 голосов
/ 25 мая 2010

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

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

"?" что вы найдете после того, как объявление int ссылается на обнуляемый тип:

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

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

...