CodeFirst で POCO の子オブジェクトを更新する際に問題があります。私のPOCOは次のとおりです
public class Place
{
public int ID { get; set;
public string Name { get; set; }
public virtual Address Address { get; set; }
}
public class Address
{
public int ID { get; set;
public string AddressLine { get; set; }
public string City { get; set; }
public virtual State State { get; set; }
}
public class State
{
public int ID { get; set;
public string Name { get; set; }
}
場所とその子のすべてのフィールドを編集するビューがあります。DropDownList である State を除いて、すべてのプロパティはテキスト ボックスです。
ユーザーが保存ボタンをクリックすると、値が DropDownList から取得され、Name が空であるため、ID のみが入力されている State を除いて、ビューはすべての Place プロパティを返します。
Edit Post Method には、次のコードがあります。
if (ModelState.IsValid)
{
bool isNewPlace = place.ID == -1;
//Hack, State name is empty from View, we reload
place.Address.State = new StateBLL().GetByID(place.Address.State.ID);
new PlaceBLL().Update(place);
return RedirectToAction("Index");
}
PlaceBLL クラスからの更新コードは次のとおりです。
protected override void Update(Place place)
{
MyDbContext.Instance().Set<Address>().Attach(place.Address);
MyDbContext.Instance().Entry(place.Address).State = System.Data.EntityState.Modified;
MyDbContext.Instance().Set<State>().Attach(place.Address.State);
MyDbContext.Instance().Entry(place.Address.State) = System.Data.EntityState.Modified;
MyDbContext.Instance().SaveChanges();
}
ユーザーが場所オブジェクトを編集すると、状態を除くすべてのフィールドが正しく更新されます。ユーザーがある場所の状態を変更すると、コードが最初にユーザーからの状態変更を検出しないように思われる場合、この変更はデータベースに保持されません。
コードが最初に Place から State 変更値を検出しない理由を知っていますか?
ありがとう。