У меня есть проект MVC3, который использует проект EF4 в качестве домена. Домен — это первый проект модели, который использует T4 для создания объектов POCO. В домене задействовано несколько сложных типов, и все отлично работает, пока я использую прокси-серверы, возвращаемые context.CreateObject().
Когда вызывается действие MVC3, связыватель модели передает объект без прокси, который содержит изменения, которые должны быть применены к домену.
Я хочу работать с "прокси"-оригиналом, чтобы представления имели доступ к свойствам навигации позже, поэтому прямое приложение AttachTo не сокращает его.
Мне нужно сначала получить «исходный» прокси-объект из контекста, а затем обновить его с помощью изменений, содержащихся в POCO, предоставленном связывателем модели.
Из того, что я читал, и мои исследования говорят мне, я должен быть в состоянии выполнить это, используя что-то вроде следующего:
public static T GetUpdatedProxy<T>(this ObjectContext context, string entitySetName, T entity)
where T : class
{
object original; // db original POCO, proxy wrapped.
var entityKey = context.CreateEntityKey(entitySetName, entity);
//Load DB object
context.GetObjectByKey(entityKey, out original)
//Apply changes from binder supplied POCO object.
context.ApplyCurrentValues<T>(entitySetName, entity); //<= error here
return (T) original;
}
Моя проблема заключается в этой ошибке:
[InvalidOperationException: The entity of type 'System.Data.Entity.DynamicProxies.Value_E954C24C522BA1D4124F434A57391656EFA4DD7CEFFD3A5CE35FC1532CD1B10A' references the same complex object of type 'Domain.DateRange' more than once. Complex objects cannot be referenced multiple times by the same entity.]
System.Data.Objects.EntityEntry.CheckForDuplicateComplexObjects(Object complexObject) +418
System.Data.Objects.EntityEntry.DetectChangesInProperties(Boolean detectOnlyComplexProperties) +211
System.Data.Objects.Internal.EntityWithChangeTrackerStrategy.UpdateCurrentValueRecord(Object value, EntityEntry entry) +93
System.Data.Objects.Internal.EntityWrapper`1.UpdateCurrentValueRecord(Object value, EntityEntry entry) +17
System.Data.Objects.EntityEntry.ApplyCurrentValuesInternal(IEntityWrapper wrappedCurrentEntity) +107
System.Data.Objects.ObjectContext.ApplyCurrentValues(String entitySetName, TEntity currentEntity) +365
- Сложный объект на непрокси-объекте и объект на прокси-объекте не совпадают.
- Объект имеет только один сложный объект, поэтому его нельзя установить несколько раз, чтобы, скажем, два свойства одного и того же типа ComplexType.
- Для самого сложного объекта на самом деле не было задано никаких значений, поэтому два поля, допускающие значение NULL, на самом деле все еще равны NULL.
- Если я использую метод AttachTo, а затем устанавливаю состояние объекта для изменения, сохранение работает, но я не могу позже использовать объект для возврата представления, потому что свойства навигации имеют значение null.
Есть предположения? Я ценю помощь.