2012-09-24 14 views
5

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 ... 
+0

¿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. –

+0

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

+0

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. –

Respuesta

0

Esto es más de un trabajo en torno a una solución real ...

que han sido capaces de determinar que el problema está relacionado con los atributos que son colecciones. Sospecho que Linq puede estar tratando de poblar una colección nula.

Inspeccionar el objeto infractor, he descubierto que puedo solucionar el problema como este:

Código antiguo:

var myObject = db.MyObjectCollection.Find(x=>x.id = myId); 

Nuevo Código

var myCollection = db.MyObjectCollection.Where(x=>x.id = myId); 
if(myCollection != null && myCollection.Count() > 0){ 
    var myObject = myCollection.First(); 
} 

esto resuelve el error. Sin embargo, el problema con esta solución es que solo resuelve el problema en el único caso que arroja el error y no hay garantía de que no aparezca en otro lugar. De hecho, ha sido un poco como jugar Whack-Em-All ya que el error reaparece en otras circunstancias.

0

Al mirar el mensaje de error supongo que está tratando de adjuntar algo que tiene una relación con algún otro objeto que no es rastreado por el ObjectStateManager (es decir, posiblemente no una entidad).

Cuestiones relacionadas