Как вставить в таблицу отношения один-к-одному через набор данных - PullRequest
1 голос
/ 03 июля 2011

Я использую asp.net 4 и DataSets для доступа к базе данных.В базе данных есть две таблицы с отношением один к одному.Это означает, что обе таблицы имеют один и тот же столбец, что и первичный ключ (скажем, Id), и одна из таблиц имеет @identity для этого набора столбцов.

Итак, в общем случае, если мы хотим вставить, мы сначала вставляем впервой таблицы, чем вставить во вторую таблицу с id.table2 = id соответствующей записи в таблице 1.

Я могу представить, как этого добиться, используя хранимую процедуру (мы вставим в первую таблицу и будем иметь идентификатор какпараметр out, а затем вставьте во вторую таблицу, используя этот идентификатор, кстати, все внутри одной транзакции).

Но есть ли способ сделать это без использования хранимой процедуры?Может быть, в DataSets \ DataAdapters встроена такая функциональность?

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 03 июля 2011

Сегодня здесь так тихо ... Хорошо, если кто-то тоже ищет такое решение, я нашел способ сделать это.

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

Я использовал DataSet Designer, чтобы воспользоваться функцией автогенерации кодаVS.Давайте назовем первую таблицу TripSets.В DataSet Designer щелкните правой кнопкой мыши TripSetsTableAdapter, затем Свойства.Разверните группу свойств InsertCommand.Здесь нам нужно сделать две вещи.

Сначала мы добавляем новый параметр в коллекцию параметров с помощью редактора коллекции параметров.Установите ParameterName = @TripId, DbType = Int32 (или что вам нужно), Direction = Output.

Во-вторых, мы изменяем CommandText (для удобства используем Query Builder).Добавьте в конец команды еще одну после точки с запятой, например:

(...);
SELECT @TripId = SCOPE_IDENTITY()

Таким образом, вы получите что-то вроде этого оператора:

INSERT INTO TripSets 
(Date, UserId)
VALUES     
(@Date,@UserId);
SELECT @TripId = SCOPE_IDENTITY()

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

int tripId;        
int result = tripSetsTableAdapter.Insert(tripDate, userId, out tripId);

// Here comes the insert method into the second table

tripSetTripSearchTableAdapter.Insert(tripId, amountPersons);

Возможно, вы захотите каким-то образом синхронизировать эти операции (например, используя TransactionScope ), но это полностьювам решать.

...