es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La instancia del tipo de entidad ” no puede ser rastreada como el tipo de entidad ” porque los dos tipos no pertenecen a la misma jerarquía.

Después de migrar de .net 5 a .net 6, comencé a recibir aleatoriamente este error en el entorno de producción:

“La instancia del tipo de entidad ‘subentity’ no se puede rastrear como el tipo de entidad ‘subentity’ porque los dos tipos no están en la misma jerarquía.”

En un intento de aislar el código que produce el error, obtengo lo siguiente:
(Llamo a la API Test1 y luego a la API Test2. Falla en la línea attributes.Db.SaveChanges())
Si cambio las consultas compiladas a consultas normales, aparentemente se soluciona el error.

TestController.cs:

public TestController(TestContext db)
{
    attributes = new ControllerAttributes(db);
}

private static readonly Func<testcontext, int=""> GetByIdQry =
    EF.CompileQuery((TestContext db, int id) =>
        db.TestEntity.FirstOrDefault(p => p.Id == id));

[HttpGet("Test")]
public void Test()
{
    var db2 = TestContext.GetContext();

    var testEntity = new TestEntity();

    testEntity.SubEntity = SubEntity.Get(attributes.Db, "29028383"); 

    db2.Dispose();
}

[HttpGet("Test2")]
public void Test2()
{
    TestEntity testEntity = GetByIdQry(attributes.Db, 263285);

    testEntity.SubEntity = SubEntity.Get(attributes.Db, "29028383");

    attributes.Db.SaveChanges(); //aquí falla
}

Subentity.cs:

private static readonly Func<testcontext, string,="" subentity=""> GetQuery =
    EF.CompileQuery((TestContext db, string number) =>
        db.Subentity.FirstOrDefault(e => e.Number == number );

public static Subentity Get(TestContext db, string number)
{
    return GetQuery(db, number);
}

Entity.cs:

cs
public class Entity
{
public int Id { get; set; }
public int SubEntityId { get; set; }
public virtual SubEntity SubEntity { get; set; }
}
</testcontext,></testcontext,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “La instancia del tipo de entidad ‘subentidad’ no se puede rastrear como el tipo de entidad ‘subentidad’ porque los dos tipos no están en la misma jerarquía” suele aparecer cuando un tipo de entidad que está siendo rastreado no está relacionado con el que se está intentando actualizar. En este caso, parece suceder aleatoriamente después de migrar de .NET 5 a .NET 6.

    En los fragmentos de código proporcionados, se utilizan dos consultas compiladas para obtener instancias de las clases TestEntity y SubEntity. Las consultas compiladas se generan en tiempo de ejecución y se almacenan en caché para obtener un mejor rendimiento. Sin embargo, parece que las consultas en caché podrían ser la causa del problema.

    Una forma de solucionar el error es evitar el uso de consultas compiladas en caché y en su lugar utilizar consultas normales. Otra posible solución es limpiar la caché de consultas después de migrar a .NET 6. Para hacer esto, puedes llamar al método estático QueryableExtensions.ClearQueryCache().

    Además, cabe destacar que la clase TestContext se utiliza en varios lugares sin ser correctamente desechada. En la acción Test, se crea una nueva instancia de TestContext pero no se desecha. En la acción Test2, se crea el contexto db2 pero no se utiliza, y en su lugar se utiliza el contexto attributes.Db. Se recomienda desechar correctamente las instancias de los contextos para evitar fugas de memoria y otros problemas.

Comments are closed.