最近、プロジェクトを MVC4 Web API に移行しました。それ以前は、標準の MVC コントローラーを使用していました。エンティティのポストバック時に、UpdateModel を使用してモデルを更新し、[dbContext].SaveChanges(); を使用してデータベースに永続化します。
すべてうまくいきましたが、Web API には UpdateModel がありません。そこで、代替手段を探しました: AutoMapper.
最初に EF 5 コードを使用し、エンティティ クラスを MVC のモデルとして使用します。
私のモデルクラス(簡略化)は次のようになります。
public class Model
{
[ForeignKey("Parent")]
public Guid ParentId { get; set; }
[IgnoreDataMember]
public TParentEntity Parent { get; set; }
public string Name { get; get; }
}
モデルが JSON で送信される場合、シリアル化中に Parent プロパティは無視されます。
したがって、エンティティを使用して API コントローラーで PUT (更新) メソッドが呼び出されると、Parent プロパティは空になります。
PUT メソッドのコードは次のとおりです。
public void Put(Model model)
{
var contextModel = Repository.GetOne(model.Id);
Mapper.CreateMap<Model , Model>();
Mapper.Map(model, contextModel);
Repository.Update();
}
Parent プロパティはモデルでは null ですが、contextModel ではありません。AutoMapper は、contextModel の Parent プロパティを null で上書きするだけです。
次に、保存すると、ParentId が存在するにもかかわらず、InvalidOperationException が発生します。
操作に失敗しました: 1 つ以上の外部キー プロパティが null 非許容であるため、リレーションシップを変更できませんでした。リレーションシップに変更が加えられると、関連する外部キー プロパティが null 値に設定されます。外部キーが null 値をサポートしていない場合は、新しい関係を定義するか、外部キー プロパティに別の非 null 値を割り当てるか、関連のないオブジェクトを削除する必要があります。
これを別の方法で行う方法についての解決策やアドバイスをいただければ幸いです。