Customer
ASP.NET Web API と Entity Framework 5 コード ファーストを使用してデータベース内の を更新しようとしていますが、うまくいきません。私のエンティティは次のようになります。
public class CustomerModel
{
public int Id { get; set; }
public string Name { get; set; }
// More fields
public ICollection<CustomerTypeModel> CustomerTypes { get; set; }
}
public class CustomerTypeModel
{
public int Id { get; set; }
public string Type { get; set; }
[JsonIgnore]
public ICollection<CustomerModel> Customers { get; set; }
}
それほど特別なことは何もありません。ユーザーが名前を入力し、1 つ以上の顧客タイプをチェックすることで顧客を追加できる Web インターフェイスを作成しました。送信ボタンを押すと、データが Web API メソッドに送信されます。
public void Put([FromBody]CustomerModel customer)
{
using (var context = new MyContext())
{
context.Customers.Attach(customer);
context.Entry(customer).State = EntityState.Modified;
context.SaveChanges();
}
}
これにより顧客フィールドが更新されますが、関連する顧客タイプは無視されます。着信オブジェクトには、関連付ける必要がある次customer
のリストが含まれています。CustomerTypes
[0] => { Id: 1, Type: "Finance", Customers: Null },
[1] => { Id: 2, Type: "Insurance", Customers: Null }
[2] => { Id: 3, Type: "Electronics", Customers: Null }
ただし、このリストを見て関連するエンティティを追加/削除する代わりに、EF はそれを無視します。新しい関連付けは無視され、既存の関連付けは削除されてもそのまま残ります。
顧客をデータベースに挿入するときにも同様の問題がありました。これは、これらのエンティティの状態を に調整したときに修正されましたEntityState.Unchanged
。当然のことながら、更新シナリオでこの同じ魔法の修正を適用しようとしました。
public void Put([FromBody]CustomerModel customer)
{
using (var context = new MyContext())
{
foreach (var customertype in customer.CustomerTypes)
{
context.Entry(customertype).State = EntityState.Unchanged;
}
context.Customers.Attach(customer);
context.Entry(customer).State = EntityState.Modified;
context.SaveChanges();
}
}
しかし、EF は同じ動作を示し続けます。
これを修正する方法についてのアイデアはありますか? それとも、リストを手動でクリアしてからCustomerTypes
手動で追加するだけですか?
前もって感謝します。
JP