Скажем, у меня есть эта структура таблицы:
Client
-----------
ClientId int not null (identity)
CurrentDemographicId int null (FK to ClientDemographic)
OtherClientFields varchar(100) null
ClientDemographic
------------------
ClientDemographicId int not null (identity)
ClientId int not null (FK to Client)
OtherClientDemographicFields varchar(100) null
Идея состоит в том, что Client (в EF) будет иметь список ClientDemographics и свойство CurrentDemographic.
Проблема в том, что когда я настраиваю структуру объекта и пытаюсь сохранить ее, я получаю следующую ошибку:
Невозможно определить допустимый порядок для зависимых операций. Зависимости могут существовать из-за ограничений внешнего ключа, требований модели или хранилища. Электронные значения
Эта ошибка имеет смысл. У меня есть круговая ссылка в моей настройке таблицы. Он не знает, какой объект вставить первым (потому что ему нужен идентификатор из обеих таблиц одновременно).
Итак, я собрал решение, которое выглядит следующим образом:
// Save off the unchanged ClientDemograpic
ClientDemographic originalClientDemographic = client.CurrentClientDemographic;
// Merge the contract into the client object
Mapper.Map(contract, client);
// If this is a new client then add as new to the list.
if (client.ClientId == 0)
{
dataAccess.Add(client);
}
// Restore the original ClientDemographic so that EF will not choke
// on the circular reference.
ClientDemographic newClientDemographic = null;
if (client.CurrentClientDemographic != originalClientDemographic)
{
newCurrentClientDemographic = client.CurrentClientDemographic;
client.CurrentClientDemographic = originalClientDemographic;
}
// save our changes to the db.
dataAccess.SaveChanges();
// Restore updates to ClientDemographics and save (if needed)
if (newClientDemographic != null)
{
client.CurrentClientDemographic = newCurrentClientDemographic;
dataAccess.SaveChanges();
}
Но изменение ссылки на предыдущее значение, сохранение, а затем повторная установка, чтобы я мог снова сохранить, похоже на взлом.
Есть ли более чистый способ работы с циклическими ссылками в EF?