Разочарование, это. Здесь пара связанных объектов, созданных базой данных 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; }
}
Здесь код, который я вызываю, чтобы сохранить DevelopmentType - он включает automapper, поскольку мы выделяем объекты сущности из 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();
}
В моем пользовательском интерфейсе наиболее распространенной операцией будет просмотр пользователем списка DevelopmentTypes и обновление их DefaultCharge. Поэтому, когда я тестирую это, используя приведенный выше код, он работает без ошибок, но ничего не меняется.
Если я приостанавливаюсь в отладчике, он очищается от того, что измененная команда DefaultCharge передается в функцию и что она привязана к типу DevelopmentType для сохранения.
Пройдя через него, если я изменил значение вручную внутри visual studio, он сохранит обновленное значение. Это еще более запутанно.
Мониторинг базы данных с помощью SQL Server Profiler показывает, что команды обновления выдаются только для родительского объекта, а не для всех подключенных объектов.
У меня есть другой аналогичный код в другом месте, который функционирует так, как ожидалось. Что я здесь делаю неправильно?
EDIT:
Я обнаружил, что если вы сделаете это до вызова SaveDevelopmentType:
using (TransactionScope scope = new TransactionScope())
{
dt.Type = "Test1";
dt.DefaultCharges.First().ChargeableRate = 99;
_CILRepository.SaveDevelopmentType(dt);
scope.Complete();
}
Изменение типа сохраняет, но изменения в ChargeableRate нет. Я не думаю, что это помогает, в массовом порядке, но я думал, что добавлю его.