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
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 –
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. –
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. –