2011-10-21 14 views
8

Estoy intentando actualizar un objeto que anteriormente he guardado con ADO.NET Entity Framework 4.1 (CodeFirst)Actualización de una referencia a un objeto secundario en el marco de la entidad 4.1 (CodeFirst)

El empleo clase tiene las siguientes propiedades ...

public class Job 
{ 
    [key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public Project Project { get; set; } 
    public JobType JobType { get; set; } 
    public string Description { get; set; } 
} 

el inicial crear obras bien, pero la actualización sólo se compromete cambios en las cadenas ..

Si cambio de los objetos secundarios por ejemplo, la propiedad de JobTypeJobTypeA a JobTypeB - t El cambio no está comprometido ...

No estoy buscando realizar un cambio a JobType, solo a Job.

using (var context = new JobContext()) 
{ 
    context.Jobs.Attach(job); 
    context.Entry(job).State = EntityState.Modified; 
    context.SaveChanges(); 
} 

Tener un vistazo a SQL - las identificaciones ni siquiera están siendo enviados para la Actualización - sin embargo, son para la inserción inicial!

Respuesta

15

Al configurar el estado en Modified, solo se actualizan las propiedades escalares y complejas, no las propiedades de navegación. Esto solo pasa a través de la detección de cambios de Entity Framework. Esto significa que es necesario cargar el original de la base de datos:

using (var context = new JobContext()) 
{ 
    var originalJob = context.Jobs.Include(j => j.JobType) 
     .Single(j => j.Id == job.Id); 

    // Update scalar/complex properties 
    context.Entry(originalJob).CurrentValues.SetValues(job); 

    // Update reference 
    originalJob.JobType = job.JobType; 

    context.SaveChanges(); 
} 

Probablemente se podría aprovechar también algunos "trucos" en su caso:

using (var context = new JobContext()) 
{ 
    var jobType = job.JobType; 
    job.JobType = null; 

    context.JobTypes.Attach(jobType); 
    context.Jobs.Attach(job); 
    // change detection starts from here, 
    // EF "thinks" now, original is JobType==null 

    job.JobType = jobType; 
    // change detection will recognize this as a change 
    // and send an UPDATE to the DB 

    context.Entry(job).State = EntityState.Modified; // for scalar/complex props 

    context.SaveChanges(); 
} 

No funcionaría, aunque si quieres establecer JobType en null.

Esta es una situación típica que se está volviendo mucho más simple si expone las claves externas como propiedades en su modelo: Con un JobTypeId en su entidad Job su código funcionaría porque la propiedad FK es escalar y establecer el estado de Modified también marque esta propiedad como modificada.

+0

"Esta es una situación típica que se vuelve mucho más simple si expone claves externas como propiedades en su modelo" ESTO. Esto debe incluirse en cada EF-tutorial. Es increíble cómo hace que las cosas "simplemente funcionen". –

+0

@EugenTimm ¿Cómo funciona eso al actualizar un separado? ¿Actualizas la propiedad de navegación o el FK? –

Cuestiones relacionadas