У меня есть приложение winforms с двумя DataGridView, отображающими отношение master-detail из моих таблиц Person и Address. Таблица Person имеет поле PersonID, которое является автоинкрементным первичным ключом. Адрес имеет поле PersonID, которое является FK.
Я заполняю свои DataTables DataAdapter и устанавливаю AutoIncrement = true и AutoIncrementStep = -1 столбца Person.PersonID. Я могу вставить записи в Person DataTable из DataGridView. Столбец PersonID отображает уникальные отрицательные значения для PersonID. Я обновляю базу данных, вызывая DataAdapter.Update (PersonTable), и отрицательные PersonID автоматически преобразуются в положительные уникальные значения SQL Server.
Вот руб. Address DataGridView показывает таблицу адресов, которая имеет отношение DataRelation к Person by PersonID. Записи вставленного лица имеют временный отрицательный идентификатор PersonID. Теперь я могу вставлять записи в Address через DataGridView и Address.PersonID устанавливается в отрицательное значение из сопоставления DataRelation. Я вызываю Adapter.Update (AddressTable), и отрицательные PersonID попадают в таблицу Address, нарушая связь.
Как вы, ребята, справляетесь с первичными / внешними ключами, используя DataTables и master-detail DataGridViews?
Спасибо!
Стив
EDIT:
После дополнительного поиска в Google я обнаружил, что событие SqlDataAdapter.RowUpdated дает мне то, что мне нужно. Я создаю новую команду для запроса последнего идентификатора, вставленного с помощью @@ IDENTITY. Это работает довольно хорошо. DataRelation обновляет поле Address.PersonID для меня, поэтому требуется сначала обновить таблицу Person, а затем обновить таблицу Address. Все новые записи вставляются правильно с правильными идентификаторами на месте!
Adapter = new SqlDataAdapter(cmd);
Adapter.RowUpdated += (s, e) =>
{
if (e.StatementType != StatementType.Insert) return;
//set the id for the inserted record
SqlCommand c = e.Command.Connection.CreateCommand();
c.CommandText = "select @@IDENTITY id";
e.Row[0] = Convert.ToInt32( c.ExecuteScalar() );
};
Adapter.Fill(this);
SqlCommandBuilder sb = new SqlCommandBuilder(Adapter);
sb.GetDeleteCommand();
sb.GetUpdateCommand();
sb.GetInsertCommand();
this.Columns[0].AutoIncrement = true;
this.Columns[0].AutoIncrementSeed = -1;
this.Columns[0].AutoIncrementStep = -1;