イライラする、これ。データベース ファーストの 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 を保存するために呼び出しているコードは次のとおりです。エンティティ オブジェクトと DTO を区別するため、automapper が含まれます。
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 にアタッチされて保存されていることが明らかです。
それをステップスルーして、ビジュアルスタジオ内で値を手動で変更すると、更新された値が保存されます。これはさらに混乱を招きます。
SQL Server プロファイラーでデータベースを監視すると、更新コマンドが親オブジェクトに対してのみ発行され、アタッチされたオブジェクトに対して発行されないことがわかります。
期待どおりに機能する他の同様のコードが他の場所にあります。ここで何が間違っていますか?
編集:
SaveDevelopmentType を呼び出す前にこれを行うと、次のことがわかりました。
using (TransactionScope scope = new TransactionScope())
{
dt.Type = "Test1";
dt.DefaultCharges.First().ChargeableRate = 99;
_CILRepository.SaveDevelopmentType(dt);
scope.Complete();
}
Type への変更は保存されますが、ChargeableRate への変更は保存されません。私はそれが大規模に役立つとは思わないが、私はそれを追加すると思った.