2009-07-21 10 views
30

Acabo de empezar a usar Entity Framework en lugar de mi NHiberante normal para ver cómo funciona EF y hasta ahora estoy teniendo muchos problemas, pero uno en particular es separar un objeto y mantenerlo los objetos secundarios relacionados.
Compré el libro O'Reilly Entity Framework que dice "sí, la estructura de entidad de forma predeterminada no mantiene el gráfico de objetos cuando se separa", pero no muestra cómo guardar el gráfico. Gracias O'Reilly eso es realmente útil.Entity Framework - Separar y mantener el gráfico de objetos relacionados

De todos modos, si alguien puede ayudar a que sería grande, código de abajo:

 using (var creativeWorkshopEntities = new CreativeWorkshopEntities()) 
     { 
      var q = from c in creativeWorkshopEntities.Job.Include("Files") 
        where c.Id == jobId 
        select c; 

      var job = q.First(); 

      creativeWorkshopEntities.Detach(job); 

      return job; 
     } 

Gracias!

Dan

Respuesta

24

Pruebe utilizar una consulta NoTracking en su lugar. De esta manera los objetos arenever adjunta, por lo que no es necesario 'de separación', que es cuando el gráfico se tritura:

es decir

using (var creativeWorkshopEntities = new CreativeWorkshopEntities())   
{    
    creativeWorkshopEntities.Job.MergeOption = MergeOption.NoTracking; 
    var q = from c in creativeWorkshopEntities.Job.Include("Files") 
      where c.Id == jobId      
      select c;    
    var job = q.First();    
    return job; 
} 

Esperanza esto ayuda

Alex

(Gerente del programa de Entidad Equipo del marco)

+0

Eso está muy bien gracias a Alex MergeOption hacer el truco para, pero el problema es, sin separar mi método de actualización no funciona, de todos modos alrededor de esto? usando (var creativeWorkshopEntities = new CreativeWorkshopEntities()) { if (job.Id> 0) creativeWorkshopEntities.AttachUpdated (job); // Método del extensor personalizado else creativeWorkshopEntities.AddToJob (job); creativeWorkshopEntities.SaveChanges(); } –

+0

Necesita aplicar ApplyPropertyChanges (...) pasando la entidad actualizada. ApplyPropertyChanges (actualizado) copia los valores de la entidad 'actualizada' en la entidad original. Para que esto funcione, la entidad 'original' debe estar en el contexto, ya sea porque retuvo una copia y la adjuntó (se recomienda) o porque hizo una consulta para volver a cargarla desde la base de datos. –

+6

¿Hay alguna manera de evitar que se triture el gráfico de entidades? ¿Por qué la separación se implementa de esta manera? – Den

0

utilizar por debajo de código para guardar objetos relacionados en la memoria.

using (var creativeWorkshopEntities = new CreativeWorkshopEntities()) 
    { 
       var q = from c in creativeWorkshopEntities.Job.Include("Files") 
         where c.Id == jobId 
         select c; 

       var job = q.First(); 

       return (Job)Detach(job); 
    } 

    private Object Detach(Object object) 
    { 
      using (var stream = new MemoryStream()) 
      { 
       var formatter = new BinaryFormatter(); 
       formatter.Serialize(stream, dbo); 
       stream.Position = 0; 
       return formatter.Deserialize(stream); 
      } 
    } 
+2

Esto solo separa un solo objeto, no el gráfico completo. –

+0

@DannyVarod ¿Por qué piensas eso? Acabo de probar esto y funciona como se esperaba, todas las entidades están ahí. – veljkoz

+0

@veljkoz La separación incorporada de EF4 solo separó un único objeto, esta implementación clona el objeto. No recuerdo por qué escribí eso, fue hace más de un año y no puedo ver ninguna edición. –

3

En EF5, MergeOption ya no está en el nivel DbSet. Así que de acuerdo a lo siguiente: http://msdn.microsoft.com/en-us/data/hh949853.aspx

Si usted quiere hacer una consulta no seguimiento que tendrá que hacer algo como:

var q = from c in creativeWorkshopEntities.Job.AsNoTracking().Include("Files") 
         where c.Id == jobId 
         select c; 
Cuestiones relacionadas