Entity Framework: volver a encontrar objetos recientemente agregados al contexto

entity-framework

Pregunta

Estoy usando el marco de la entidad y tengo un problema con los objetos "re-encontrando" que acabo de crear ... básicamente esto es así:

string theId = "someId";

private void Test()
{
  using(MyEntities entities = new MyEntities())
  {
    EntityObject o = new EntityObject();
    o.Id = theId;
    entities.AddToEntityObject(o);
    CallSomeOtherMethod(entities);
  }
}

void CallSomeOtherMethod(MyEntities ents)
{
  EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId);
  if(search == null) 
  {
    Console.WriteLine("wha happened???");
  }
}

(No hay garantía de que el código funcione por cierto, todo es de mi cabeza)

¿Por qué la consulta no "encuentra" el EntityObject que se acaba de crear?

Si llamo a SaveChanges () después de AddToEntityObject, funciona (lo que no me sorprende), ¿pero por qué no se extrae de la memoria caché correctamente?

Todavía estoy verde en estas cosas, así que espero que haya una cosa realmente fácil que simplemente estoy pasando por alto ...

Gracias

Respuesta aceptada

Esto sucede porque ents.EntityObject.WhatEver siempre consulta la fuente de datos. Esta es una decisión de diseño. Lo hacen de esta manera, porque de lo contrario tendrían que ejecutar la consulta en la fuente de datos, en el caché local y luego fusionar los resultados. Como uno de los desarrolladores señaló en un blog (no puedo recordar dónde exactamente) no pudieron manejar esto de manera consistente.

Como puede imaginar, hay muchos casos de esquinas y aristas que debe manejar adecuadamente. Simplemente puede encontrar un ID que haya creado localmente, creado por otra persona en la base de datos. Esto obligaría a estar preparado para manejar conflictos en (casi) todas las consultas. Tal vez podrían haber creado métodos para consultar la caché local y métodos para consultar la fuente de datos, pero eso tampoco es muy inteligente.

Puede echar un vistazo a Transparent Lazy Loading para Entity Framework . Esto reemplaza al generador de código normal y obtiene entidades que llenan sus colecciones de entidades relacionadas y las referencias de entidades automáticamente en el acceso. Esto evita todo el

if (!Entity.ReleatedEntities.IsLoaded)
{
   Entity.RelatedEntities.Load();
}

Fragmentos de código. Y puedes consultar las colecciones porque siempre están cargadas implícitamente. Pero esta solución no es perfecta, también. Hay algunos problemas. Por ejemplo, si crea una nueva entidad y accede a una colección de entidades relacionadas, obtendrá una excepción porque el código no puede recuperar las entidades relacionadas de la base de datos. También hay un problema relacionado con el enlace de datos y puede haber algunos más que no conozco.

Lo bueno es que obtiene el código fuente y puede solucionar los problemas usted mismo y voy a examinar el primer problema si encuentro algo de tiempo. Pero estoy bastante seguro de que no será tan fácil de solucionar, porque espero que algunos casos no lleguen a la base de datos si la entidad se acaba de crear no es el comportamiento esperado.


Respuesta popular

el objeto recién agregado está en el origen de datos local, ya que aún no está en la base de datos, por lo que puede decir EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId) ?? ents.EntityObject.Local.FirstOrDefault(o => o.Id == theId);



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué