2010-12-09 10 views
6

Tengo un problema al usar EF4, cuando intento verificar si el objeto ya está dentro del contexto de Entity Framework.Verificar si el objeto ya está dentro del contexto de Entity Framework

que tienen el código de abajo

 var entityName = Entity4Test + Guid.NewGuid(); 

     using(var ctx = new EnviroDataContext()) 
     { 
      var etc = new Entity 
      { 
       Name = entityName 
      }; 

      ctx.Entity.AddObject(etc); 

       var q = from p in ctx.Entity 
         where p.Name == entityName 
         select p; 

// Why 'q.ToList().Count == 0'? 

       ctx.SaveChanges(); 
      } 

Mi pregunta es, ¿por qué mi búsqueda después de la inserción, salió vacío?

Sé que los datos se conservan después de 'Guardar Cambios', pero ¿qué ocurre si necesito 'consultar' los datos de mi memoria de entidad.

La extensión de la pregunta

Tengo una regla de negocio mediante la adición de 1 punto A, desencadena la inserción de otras entidades B. La cuestión es, tengo regla de validación que al insertar B, t A ya debe existir.

Dado que todas estas acciones se realizan antes de 'Guardar Cambios', me sale un error de que EntityA no existe.

Otro caso, tengo un campo Nombre que es único en una tabla. Si intento ejecutar AddEntityName ("bla") dos veces y luego "SaveChanges", obtengo una excepción de DB [restricciones exclusivas], incluso después de pasar mi validación para la inserción, lo que garantiza que un nombre sea único.

¿Alguien tiene alguna idea?

Respuesta

9

Cuando lo hace .AddObject, lo agrega al "gráfico" (memoria) interno de EF en un estado pendiente de "Añadido".

Solo cuando lo haga ctx.SaveChanges(), los cambios se conservarán en la tienda subyacente.

La consulta que está escribiendo va contra la base de datos, y el cambio no se ha conservado todavía.

Por lo tanto, si ejecuta su consulta después de hace , el recuento será el esperado.

En una nota lateral, si usted quiere ver si una entidad ya está en la gráfica (por ejemplo antes de "Attach"), leer sobre ObjectStateManager.TryGetObjectStateEntry.

+0

Entiendo lo que dices, pero la pregunta es si ese comportamiento tiene sentido, si tienes reglas comerciales que implican más inserciones y validaciones. – muek

+0

@muek - lo siento, no entiendo su pregunta. ¿Qué quieres decir? – RPM1984

+0

lol mi mal. mira mi pregunta extendida – muek

1

No he usado EF4 pero he usado la versión anterior, así que no sé si su expectativa es diferente en EF4. Parece que está intentando buscar el activo en el DB antes de comprometerlo. Primero debe llamar a SaveChanges y luego buscarlo.

Cuestiones relacionadas