Entity Framework não salvando crianças modificadas
Frustrante isso. Aqui está um par de objetos relacionados, conforme gerado pelo primeiro Entity Framework do banco de dados:
public partial class DevelopmentType
{
public DevelopmentType()
{
this.DefaultCharges = new HashSet<DefaultCharge>();
}
public System.Guid RowId { get; set; }
public string Type { get; set; }
public virtual ICollection<DefaultCharge> DefaultCharges { get; set; }
}
public partial class DefaultCharge
{
public System.Guid RowId { get; set; }
public decimal ChargeableRate { get; set; }
public Nullable<System.Guid> DevelopmentType_RowId { get; set; }
public virtual DevelopmentType DevelopmentType { get; set; }
}
Aqui está o código que estou chamando para salvar um DevelopmentType - envolve o automapper, já que diferenciamos objetos de entidade de DTOs:
public void SaveDevelopmentType(DevelopmentType_dto dt)
{
Entities.DevelopmentType mappedDevType = Mapper.Map<DevelopmentType_dto, Entities.DevelopmentType>(dt);
_Context.Entry(mappedDevType).State = System.Data.EntityState.Modified;
_Context.DevelopmentTypes.Attach(mappedDevType);
_Context.SaveChanges();
}
Na minha interface de usuário, a operação mais comum será para um usuário examinar uma lista de Tipos de Desenvolvimento e atualizar seu DefaultCharge. Então, quando eu testo isso usando o código acima, ele é executado sem erro, mas nada realmente muda.
Se eu fizer uma pausa no depurador, fica claro que o DefaultCharge alterado está sendo passado para a função e que está anexado ao DevelopmentType a ser salvo.
Passando por isso, se eu alterar o valor manualmente dentro do visual studio,faz salve o valor atualizado. O que é ainda mais confuso.
Monitorar o banco de dados com o SQL Server Profiler revela que os comandos de atualização são emitidossó para o objeto pai enão para quaisquer objetos anexados.
Eu tenho outro código semelhante em outro lugar que funciona como esperado. O que eu estou fazendo errado aqui?
EDITAR:
Eu descobri que, se você fizer isso antes da chamada para SaveDevelopmentType:
using (TransactionScope scope = new TransactionScope())
{
dt.Type = "Test1";
dt.DefaultCharges.First().ChargeableRate = 99;
_CILRepository.SaveDevelopmentType(dt);
scope.Complete();
}
A alteração para Type salva, mas a alteração para ChargeableRate não. Eu não acho que isso ajuda, massivamente, mas pensei em adicionar isso.