Entity Framework nie zapisuje zmodyfikowanych dzieci
Frustrujące, to. Oto para powiązanych obiektów, wygenerowanych przez bazę danych Entity Framework:
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; }
}
Oto kod, który wywołam, aby zapisać DevelopmentType - dotyczy automappera, ponieważ odróżniamy obiekty encji od DTO:
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();
}
W moim interfejsie użytkownika najczęstszą operacją będzie wyświetlenie listy DevelopmentTypes przez użytkownika i zaktualizowanie jego DefaultCharge. Więc kiedy testuję to używając powyższego kodu, działa bez błędu, ale tak naprawdę nic się nie zmienia.
Jeśli zatrzymam się w debuggerze, jasne jest, że zmieniony DefaultCharge jest przekazywany do funkcji i że jest dołączony do typu DevelopmentType, który ma zostać zapisany.
Przechodząc przez to, jeśli zmienię wartość ręcznie w studio wizualnym, torobi zapisz zaktualizowaną wartość. Co jest jeszcze bardziej mylące.
Monitorowanie bazy danych za pomocą SQL Server Profiler ujawnia, że wydawane są polecenia aktualizacjitylko dla obiektu nadrzędnego inie dla wszelkich dołączonych obiektów.
Mam inny podobny kod, który działa zgodnie z oczekiwaniami. Co ja tu robię źle?
EDYTOWAĆ:
Odkryłem, że jeśli zrobisz to przed wywołaniem SaveDevelopmentType:
using (TransactionScope scope = new TransactionScope())
{
dt.Type = "Test1";
dt.DefaultCharges.First().ChargeableRate = 99;
_CILRepository.SaveDevelopmentType(dt);
scope.Complete();
}
Zmiana na Type zapisuje, ale zmiana na ChargeableRate nie. Nie sądzę, żeby to pomogło, masowo, ale pomyślałem, że to dodam.