Я - давний читатель - первый постер - и после бесчисленных часов исследований по этой проблеме Entity Framework я почувствовал, что мне нужна помощь.Я новичок в C # и новичок в программировании, поэтому, пожалуйста, потерпите меня.
У меня довольно простое отношение «многие ко многим» в моей модели данных со стилем «2.0» в стиле Web 2.0.У смен есть теги, а у пользователей есть теги.
Я вытаскиваю смену из кэша.Когда я пытаюсь сделать копию смены, копируя сведения о смене и теги из кэшированной копии, я делаю следующее (упрощенно).
Data.Shift s = new Data.Shift();
/* copy over a bunch of stuff from the cached shift object. I'll spare the boring details */
foreach (var t in shift.Tags) { //shift object is a cached object
Data.Tag dt = new Data.Tag
{
TagID = t.TagID,
Name = t.Name,
OrgID = t.OrgID,
};
s.Tags.Add(dt);
}
Даже если я явно установил TagID вНовый объект Data.Tag, в SaveChanges () новый тег вставляется в БД, а не просто создается связь с тегом, который уже существует в БД.TagID - это столбец идентификатора PK
Когда я пытаюсь использовать следующий код:
foreach (var t in shift.Tags){
s.Tags.Add(t)
}
Очевидно, что он не выполняется, поскольку сдвиг был кэширован из контекста объекта, отличного от контекста текущих запросов.
Есть мысли?Насколько я могу сказать:
- Очистка кэша для меня не вариант из-за проблем с производительностью - я понимаю, что вся эта проблема исчезнет, если я выполню эту работу в том же контексте объекта,
- Кроме того, извлечение Data.Tag из БД в текущем контексте не вариант из-за проблем перфорирования.
Это кажется очень простой вещью, которую я пытаюсь сделать...
Редактировать Хорошо - я пытался обновить мой код с обоими решениями, но у меня проблемы с обоими.Давайте попробуем первый:
// ctx is grabbed up here from HttpContext.Current.Items
Data.Shift s = new Data.Shift();
/* copy over a bunch of stuff from the cached shift object. I'll spare the boring details */
foreach (var t in shift.Tags) { //shift object is a cached object
Data.Tag dt = new Data.Tag
{
TagID = t.TagID,
Name = t.Name,
OrgID = t.OrgID,
};
ObjectStateEntry entry;
ctx.ObjectStateManager.TryGetObjectStateEntry(t.EntityKey, out entry);
if (entry == null || entry.State == EntityState.Detached) {
ctx.Tags.Attach(t);
}
s.Tags.Add(dt);
}
Это выдает следующую ошибку:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
Я предполагаю, что причина, по которой я получаю, заключается в этой ошибке, потому что объект сдвига иего теги извлекаются из кэша (очевидно, из разных контекстов).Мысли?