EF6 WebApiからエンティティをマージします
-
20-12-2019 - |
質問
CRUDシステム(皮肉)を近代化することの栄光の使命で任務されました。私はEF 6.1.1とWebAPIを使用しています。私はDTOを使用してエンティティを送信します(すべてが機能しているときに静的なタイプを作成するようになりましたが、呼び出しをasync
にする)
[HttpGet]
public dynamic Get(int id)
{
var p = personRepository.Get(id);
return new
{
p.PersonId,
p.BirthYear,
p.DeathYear,
p.Comment,
PersonNames = p.PersonNames.Select(pn => new { pn.PersonId, pn.PersonNameId, pn.NameTypeId, pn.Firstname, pn.Prefix, pn.Surname })
};
}
.
Person
オブジェクトのフィールドを更新するか、PersonNames
とKnockout
ko.mapping
コレクションを追加/削除/更新する
結果をこのWebAPIメソッドに転記
[HttpPost]
public void Post([FromBody]Person person)
{
personRepository.Merge(person);
}
.
すべてのIDなどは正しい、personRepository.Merge
で
public void Merge(Person person)
{
db.People.AddOrUpdate(person);
db.SaveChanges();
}
.
PersonObjectで直接フィールドには機能しますが、PersonNames
手動マージコードを書いてもこれをサポートできますか?
解決策 この
をやって終わったpublic void Merge(Person person)
{
db.People.AddOrUpdate(person);
var existingNames = db.PersonNames.Where(pn => pn.PersonId == person.PersonId).ToList();
var deleted = existingNames.Where(pn => person.PersonNames.All(d => d.PersonNameId != pn.PersonNameId));
db.PersonNames.RemoveRange(deleted);
foreach (var name in person.PersonNames)
{
db.PersonNames.AddOrUpdate(name);
}
db.SaveChanges();
}
. 解決
あなたが言及したことを述べたことはこれが私に賢明に見えるcrudシステムです。あなたのDTOからドメインエンティティへのバックからマッピングを本当に避けることができる方法はわかりません(たとえばPerson)
私はあなたがすでにそれを考えたと思いますが、Automapperのようなものを使用してできるだけ多くのボイラープレートマージコードを取り除くのはどうですか? https://github.com/automapper/automapper
マッピングは、ナビゲーションプロパティに複雑になります(すなわち、DTOのオブジェクトグラフ間のマッピングは、エンティティのオブジェクトグラフに戻ります)。このリンクは、できるだけ多くの詳細になります。