Чистый способ работы с циклическими ссылками в EF?

Скажем, у меня есть эта структура таблицы:

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?

17
задан Vaccano 11 November 2011 в 22:47
поделиться