문제

나는 Crud 시스템 (아이러니콘)을 현대화하는 영광스러운 임무로 임무를 해왔습니다.EF 6.1.1 및 WebApi를 사용하고 있습니다.DTO를 사용하여 엔티티를 보냅니다.

[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 })
    };
}
. 그런 다음 I async 객체의 필드를 업데이트하거나 PersonPersonNames를 사용하여 Knockout Collection을 추가 / 제거 / 업데이트합니다.

이 WebApi 방법에 결과를 게시

[HttpPost]
public void Post([FromBody]Person person)
{
    personRepository.Merge(person);
}
.

모든 ID 등이 올바른 것입니다. ko.mapping에서

를 시도했습니다.
public void Merge(Person person)
{
    db.People.AddOrUpdate(person);
    db.SaveChanges();
} 
.

이 필드에 직접 PersonObject에서 작동하지만 personRepository.Merge

에서 추가 / 제거 / 업데이트에서는 작동하지 않습니다.

수동 병합 코드를 작성하지 않고이 문제를 지원할 수 있습니까?

솔루션 이 작업을 끝내 었습니다

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에서 도메인 엔티티 (예 : 사람)

에 맵핑을 방지하는 방법을 볼 수는 없습니다.

Automapper와 같은 것을 사용하여 가능한 한 많은 보일러 플레이트 병합 코드를 제거하는 방법은 무엇이었습니다. https://github.com/automapper/automapper

맵핑은 탐색 속성 (즉, DTO의 객체 그래프 간의 객체 그래프의 객체 그래프의 객체 그래프 간의 매핑)이 복잡해집니다.이 링크는 내가 할 수있는 것보다 훨씬 더 자세히 들어갑니다. http://rogeralsing.com/2013/12/01/WHY-MAPPATION-DTOS-TO-TOISTION-AUTOMAPPAPPERANTITYFRAMEWORK-AUTHORIBLE/ / P>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top