2011-04-01 14 views
16

Uso primero el código y puedo agregar registros sin problemas. La base de datos se crea correctamente y se siembra sin ningún problema. Pero al llamar a SaveChanges() en mi acción Editar solo actualiza la entidad, no ninguna de las propiedades de navegación o referencia.EF 4.1 SaveChanges no actualiza las propiedades de navegación o referencia

Una versión simplificada de mi modelo:

public class Contact : IMyBaseObject 
{ 
    public Contact() 
    { 
     this.Delete = false; 
     this.ContactTypes = new HashSet<ContactType>(); 
    } 

    public int Id {get; set;} 

    public string Name {get;set;} 

    public bool Delete {get;set;} 

    public virtual ICollection<ContactType> ContactTypes { get; set; } 

    public virtual USState USState { get; set; } 

} 

public class ContactType : MyBaseObject 
{ 
    public ContactType() 
    { 
    } 

    public int Id {get; set;} 

    public string Name {get;set;} 

    public virtual ICollection<Contact> Contacts {get;set;} 
} 

public abstract class Territory : MyBaseObject 
{ 
    public int Id {get; set;} 

    public string Name {get;set;} 

    public string Code {get;set;} 
} 

public class USState : Territory 
{ 
    public USState() 
    { 
    } 

    // Navigation properties 
    public virtual ICollection<Contact> Contacts { get; set; } 
} 

no incluirá el código, pero tengo un poco de modelo personalizado de unión pasando. Mi acción Editar (utilizando MVC 3) no se estaba completando con las propiedades ContactType o USState. La vinculación devuelve correctamente un objeto de contacto completamente poblado con los valores correctos del formulario.

Si entiendo EF 4.1 correctamente, lo único que tendría que hacer lo siguiente para persistir los cambios en la base de datos al guardar mi objeto de contacto:

if(ModelState.IsValid) 
{ 
    context.Entry(contact).State = EntryState.Modified; 
    context.SaveChanges(); 
} 

Sin embargo, sólo las propiedades primitivas se actualizan cuando hago eso . He omitido algunas cosas en el ejemplo anterior: estoy usando una transacción, un bloque try catch y comprobando si se trata de un nuevo registro.

He utilizado SQL Profiler y puedo confirmar que las consultas de actualización para las tablas ContactType y Territory son y no están siendo enviadas al servidor de la base de datos.

Las propiedades del Estado de mis propiedades de navegación y de referencia se modifican, pero también me han intentado fijar manualmente que:

context.Entry(contact).Collections("ContactTypes").EntityEntry.State = EntityState.Modified; 
    context.Entry(contact).Reference("USState").EntityEntry.State = EntityState.Modified; 

Podría estar equivocado, pero estoy bastante seguro de que mi código se trabaja bajo CTP5.

¿Alguna idea? En este punto, no estoy seguro de cómo debería abordar la depuración de esto.

Gracias, Steve

+2

Esta pregunta se realizó la tercera vez durante las últimas 21 horas. Aquí están los anteriores: http://stackoverflow.com/questions/5506116/entity-framework-code-first-why-cant-i-update-complex-properties-this-way y http://stackoverflow.com/questions/ 5507596/entity-framework-4-1-rc-code-first-entity-not-updating-over-association –

+0

Interesante. Apliqué la solución que describiste en las otras preguntas y no funciona para mí. Sin error, pero no se enviaron consultas de actualización a la base de datos. Supongo que intentaré eliminar las propiedades de navegación/referencia e intentar volver a agregarlas. –

+0

Steve, ¿qué es MyBaseObject ?, no vi el código de esa clase en tu publicación. Asumo que es una clase porque no sigue la convención de ser una interfaz. En segundo lugar, es posible que desee implementar un patrón de repositorio muy básico para DbContext, ya que esto ayudará a mantener su código más organizado y le dará un nivel de abstracción, por así decirlo. –

Respuesta

0

Asumiendo que su objetos DAL/Colección son de Entity Framework, hacer esto;

Contact.ContactTypes.Load();

esto refresca la lista coltactTypes relacionados de la fuente subyacente.

Espero que esto ayude.

1

Prueba esto:

context.Entry(contact.USState).State = EntityState.Modified; ////// 
0

El código proporcionado podría no ser suficiente. Es mejor ver el código de cómo se agregaron las propiedades de navegación en el código. Porque aunque la clase principal se marcó como modificada, no significa que las propiedades de navegación relacionadas también están marcadas como Agregadas o modificadas. La manera más rápida es activar el depurador en el que se llamó a .SaveChanges, y luego observar la variable de contexto, buscar en las propiedades "Locales" y luego si las propiedades de navegación están allí, también si se agregó o modificó su estado modal, entonces será mucho más fácil decir lo que se necesita hacer.

0

estoy seguro de que un código más ayudará a determinar mejor el problema, especialmente el código para el encuadernado del modelo. pero una cosa con la que creo que ya está familiarizado es que necesita acceder a esas propiedades de navegación (de alguna manera) para que EF pueda cargarlas automáticamente.porque marcó sus propiedades de navegación como virtuales, está permitiendo que EF cree proxies y anule sus propiedades de navegación para permitir la carga diferida.

Cuestiones relacionadas