Я застревал с этой проблемой больше недели теперь. Надо надеяться, кто-то может указать на меня в правильном направлении.
Я запускаю с краткого описания своей схемы.
Актив 1---> 1 Адрес *-> 1 область *-> 1 регион *-> 1 Страна
Пакет 1-> * Актив
Использование Самого отслеживания объекта (STE) + WCF.
Шаги:
На шаге 2 вызов использует нетерпеливую загрузку Адресов.
from p in context.Assets.Include("Address.Area.Region.Country")
Это - ошибка при попытке звонить
context.Packages.ApplyChanges(package)
AcceptChanges не может продолжиться, потому что значения ключа объекта конфликтуют с другим объектом в ObjectStateManager. Удостоверьтесь, что значения ключа уникальны прежде, чем назвать AcceptChanges.
Править
После отслеживания вокруг, я нашел, что это - проблема STE. Так как проблема - Вы, не может сохранить график, который содержит несколько экземпляров того же объекта, как обрисовано в общих чертах здесь. Вот мой вопрос.
Как я могу добавить объект к своему набору объекта. Новый объект, возможно, связал объекты, которые уже содержат тот же ключ как один в наборе. Т.е. Добавьте новый актив, который может содержать тот же адрес, область, регион или объект страны.
Вот, мой ограничивает:
Я знаю о возможных решениях, предложенных Diego B Vega, но это не опции, которые я могу использовать для своего решения. У кого-либо есть какие-либо другие идеи?
Думали ли вы просто отказаться от ORM и вернуться к нормальному доступу, если вы понимаете, что я имею в виду: -)
Не шучу - к тому времени, когда вы будете бороться с одним синглом проблема, подобная этой (которая больше всего пахнет ошибкой ORM), вы могли бы развернуть свои собственные 5-10 функций для выполнения обычных вызовов sproc и более простого преобразования типов данных, а затем вы вернетесь к полному контролю и не застрянете библиотеками, для стабилизации которых потребуется еще около 5 лет.
Тем более, что у вас очень чистая схема, то есть довольно простые запросы и прямые обновления.
Я столкнулся с той же проблемой и, наконец, нашел решение. Основная идея состоит в том, чтобы предотвратить присоединение определенного типа навигационного класса к ObjectContext. Вот что я сделал:
public static void CustomApplyChanges (это Контекст ObjectContext, строка entitySetName, объект TEntity, Тип [] excludeTypes ), где TEntity: IObjectWithChangeTracker
region Handle Initial Entity State
foreach (IObjectWithChangeTracker changedEntity в entityIndex.AllEntities.Where (x => x.ChangeTracker.State == ObjectState.Deleted && ! ExcludeTypes.Contains (x.GetType ()))) {HandleDeletedEntity (контекст, entityIndex, allRelationships, changedEntity); }
foreach (IObjectWithChangeTracker changedEntity в entityIndex.AllEntities.Where (x => x.ChangeTracker.State! = ObjectState.Deleted && ! excludeTypes.Contains (x.GetType ()))) {HandleEntity (контекст, entityIndex, allRelationships, changedEntity); }
endregion
Тип [] excludeTypes = {typeof (Актив), typeof (Адрес), typeof (Регион)};
rep.Entities.CustomApplyChanges (entity, excludeTypes); var changedEntry = rep.Context.ObjectStateManager.GetObjectStateEntries> (System.Data.EntityState.Added | System.Data.EntityState.Modified | System.Data.EntityState.Deleted); foreach (var e в changedEntry) { если (excludeTypes.Any (c => c == e.Entity.GetType ())) { rep.Context.Detach (e.Entity); // отключаем неизмененные объекты } }