Ошибка вставки 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 / проблема внешнего ключа

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

0 ответов

Другие вопросы по тегам