estoy usando Entity Framework 4.3.1 desde una aplicación web ASP .NET 3.0 MVC y tengo un poco de código que separa un objeto viejo y lo reemplaza con un nuevo objeto que se ve así:¿Cuál es la causa raíz de la excepción "The RelatedEnd no puede ser devuelto por este RelationshipManager" en Entity Framework?
public void UpdateUnattached(T entryToUpdate, T updatedEntry)
{
var ctx = (EntityFrameworkContext) _context;
ctx.ChangeObjectState(EntityState.Detached, entryToUpdate);
_set.Attach(updatedEntry);
ctx.ChangeObjectState(EntityState.Modified, updatedEntry);
}
Esto funciona todo el tiempo excepto en un caso cuando obtengo la excepción a continuación en la línea _set.Attach
.
Este RelationshipManager no puede devolver el RelatedEnd. Un RelatedEnd solo puede ser devuelto por un RelationshipManager para los objetos que son seguidos por ObjectStateManager o que implementan IEntityWithRelationships.
El gráfico de objetos es bastante profundo y creo que me está diciendo que hay una propiedad que se ha establecido en un objeto que no se ha modificado en algún lugar (corríjanme si me equivoco). Entonces, mi pregunta es ...
¿Cómo puedo averiguar cuál es la causa de esta excepción?
He intentado poner try/catch alrededor y llamar al GetValidationErrors
en el catch pero eso también arroja con la misma excepción.
Más información de la excepción (InnerException
es nulo) ...
Type: System.InvalidOperationException
Source: System.Data.Entity
Target site: GetRelatedEndInternal
Stacktrace: at System.Data.Objects.DataClasses.RelationshipManager.GetRelatedEndInternal(String relationshipName, String targetRoleName)
at System.Data.Objects.EntityEntry.FindRelatedEntityKeysByForeignKeys(Dictionary`2& relatedEntities, Boolean useOriginalValues)
at System.Data.Objects.EntityEntry.TakeSnapshotOfForeignKeys()
at System.Data.Objects.ObjectStateManager.PromoteKeyEntryInitialization(EntityEntry keyEntry, IEntityWrapper wrappedEntity, IExtendedDataRecord shadowValues, Boolean replacingEntry)
at System.Data.Objects.ObjectContext.AttachSingleObject(IEntityWrapper wrappedEntity, EntitySet entitySet, String argumentName)
at System.Data.Objects.ObjectContext.AttachTo(String entitySetName, Object entity)
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
at System.Data.Entity.Internal.Linq.InternalSet`1.Attach(Object entity)
at System.Data.Entity.DbSet`1.Attach(TEntity entity)
at ... snip ...
¿No debería actualizar la entidad adjunta con los valores de la entidad no vinculada en lugar de tratar de intercambiarlos? Pareces cortar algunas asociaciones por eso. –
Gracias, sí, curiosamente, si hago exactamente lo que dice (establezco cada propiedad de entryToUpdate en updatedEntry y luego la guardo en lugar de adjuntarla) funciona. Lo que quiero saber, sin embargo, es por qué la conexión no funciona y saber que quiero saber cómo saber cuál fue la causa raíz de esta excepción. Seguramente desde que lanzó la excepción, el marco debe saberlo, solo desearía que me lo hubiera dicho. – kmp
Creo que es el desapego lo que causa problemas.Entiendo por la excepción que RelationshipManager intenta resolver las asociaciones de un objeto que ya no se rastrea. –