Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

217
Vistas
Entityframework > Obtener entidad rastreada por clave (referencia diferente)

Necesito la funcionalidad para recuperar una entidad rastreada por clave sin una llamada SQL a la base de datos. Así que necesito algo como .Find pero si no se rastrea, se devuelve NULL .

La razón por la que necesito esto es porque el siguiente código arroja:

 public void Test() { var id = 5; var a = new Entity { Id = id }; _ctx.Entry(a).State = EntityState.Added; var b = new Entity { Id = id }; var bEntry = _ctx.Entry(b); // Delete entity // When it was already added in this 'lifetime' detach it again (since it's not saved in the DB yet) if (bEntry.State == EntityState.Added) bEntry.State = EntityState.Detached; else bEntry.State = EntityState.Deleted; var c = new Entity { Id = id }; var cEntry = _ctx.Entry(c); // Add entity // When it was already deleted in this 'lifetime' detach it again (since it's not removed in the DB yet) if (cEntry.State == EntityState.Deleted) cEntry.State = EntityState.Detached; else cEntry.State = EntityState.Added; var d = new Entity { Id = id }; var dEntry = _ctx.Entry(d); }

Si nunca creara nuevas entidades pero siempre usara a archivo . Este código funcionará. La razón por la que no funciona ahora es porque EF realiza un seguimiento interno de las entidades en un diccionario mediante una 'comparación por referencia' ( https://github.com/dotnet/efcore/blob/9ac01d6035c76626d89aa1a3cd8d200db2c3c0e1/src/EFCore/ChangeTracking/ Interno/EntityReferenceMap.cs#L103 )

Como resultado, los usos de TryGetValue EF serán false y creará una nueva entrada con el estado Detached . Y luego, el código fallará porque intento agregar una entidad que ya está rastreada.

Este problema anterior se resolvería si pudiera obtener la entidad rastreada, ya que tendrían la misma referencia. Pero parece que no encuentro una manera de acceder al mismo código que ocurre en .Find() . En teoría, podría usar la propiedad .Local u obtenerla usando ChangeTracker.Entries() pero dado que estas son solo listas regulares, el rendimiento para buscar la entrada está tardando demasiado.

Sé que esta es una pregunta muy específica. Pero realmente parece que no encuentro nada. Es un poco vergonzoso rendirse ya que internamente EF sabe lo que necesito.

Brecht

over 4 years ago · Santiago Trujillo
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda