質問

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オブジェクトのフィールドを更新するか、PersonNamesKnockout

を使用して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のオブジェクトグラフ間のマッピングは、エンティティのオブジェクトグラフに戻ります)。このリンクは、できるだけ多くの詳細になります。 http://rogeralsing.com/2013/12/01/-mapping-dtos-to-entities-using-automapper-and-entityFramework-is-horrible /

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top