Ошибка вставки Entity Framework при использовании 2 EntityKeys
Ниже приведен пример ошибки, которую я получаю. Кодовые имена и тому подобное были изменены, чтобы сделать его более читабельным, и он был "ошарашен", чтобы просто показать части, с которыми у меня проблемы.
СТОЛОВАЯ СТРУКТУРА:
РЕЗЮМЕ
Я пытаюсь добавить новый элемент CHILD вместе с АДРЕСОМ, используя Entity Framework 3.5, и получаю дублирующиеся ошибки ввода, когда я использую 2 ссылки на сущность в процессе.
ЭФФЕКТЫ КОДА
Сначала я попытался использовать родительские ссылки при создании объекта:
public bool AddChild(Guid parentId, string firstName, string lastName, string address, string city, int provinceCode)
{
bool success = false;
using (Entities e = new Entities("connection string")
{
// prep address record
ADDRESS a = new ADDRESS
{
City = city,
Address = address,
PROVINCEReference = new System.Data.Objects.DataClasses.EntityReference<PROVINCE> { EntityKey = new System.Data.EntityKey("Entities.PROVINCEs", "ID", provinceCode) },
};
// prep owner record
CHILD c = new CHILD
{
PARENTReference = new System.Data.Objects.DataClasses.EntityReference<PARENT> { EntityKey = new EntityKey("Entities.PARENTs", "ID", new Guid(parentId)) },
ADDRESS = a,
FirstName = firstName,
LastName = lastName,
};
using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
{
try
{
e.AddToCHILDs(c);
e.AddToADDRESSes(a);
// Save changes pessimistically. This means that changes must be accepted manually once the transaction succeeds.
e.SaveChanges(false);
}
catch { }
}
}
return success;
}
Это не работает, если я пытаюсь ссылаться на оба внешних ключа; однако, если я просто попытаюсь сослаться на один или другой, он работает нормально. Первый всегда будет работать. Второй выдаст ошибку. Неважно, в каком порядке они находятся. Если я использую их самостоятельно или другими способами, они работают нормально.
Я также пытался получить реальные предметы, а не просто ссылки, такие как:
PARENT o = e.PARENTs.First(x => x.ID.Equals(id));
PROVINCE p = e.PROVINCEs.First(x => x.ID.Equals(1));
a.PROVINCE = p;
c.ADDRESS = a
c.PARENT = o;
И я попытался поиграть с методом.Attach() после обнаружения похожих ошибок:
e.Attach(p);
e.Attach(o);
Когда я делаю это первым способом (мой предпочтительный способ), какой бы элемент не был добавлен первым, он будет работать без проблем. При попытке второго я получаю сообщение об ошибке (элемент с таким же ключом уже добавлен). Если я пытаюсь сделать это, извлекая фактические записи, а не просто используя ссылку, я получаю тот же тип ошибки непосредственно из базы данных SQL Server 2005.
После прочтения становится понятным, что это связано с контекстом и тем фактом, что код может ссылаться на 2 разные версии родительских записей; Однако я не могу найти хороший способ обойти это.
Все, что я хочу сделать в конце, это вставить дочернюю запись с новым адресом. Дочерняя запись должна ссылаться на родительскую запись, а запись адреса должна ссылаться на запись провинции. Предпочтительно, я хотел бы сделать это с помощью ссылок, чтобы сократить транзакции SQL.
Спасибо!
РЕДАКТИРОВАТЬ
Попытался создать 2 моих собственных отдельных объекта entityKey и 2 отдельных объекта EntityReference<>, и теперь я получаю следующую ошибку, когда пытаюсь использовать второй объект EntityReference <> для назначения отношения / ссылки:
EntityReference не удалось инициализировать, поскольку менеджер отношений для объекта, к которому относится ссылка на объект, уже присоединен к ObjectContext.
РЕДАКТИРОВАТЬ
Использование обходного пути, который не нуждается в каких-либо отношениях / справочной информации из ответа Алекса по адресу: Entity Framework EntityKey / проблема внешнего ключа
Я все же предпочел бы не использовать это, потому что это заставляет вас делать проверки, чтобы увидеть, какая информация уже находится в контексте, а затем создает "фальшивые" записи, чтобы обойти ее в качестве обходного пути. Если у кого-то есть еще информация, я бы хотел услышать!