EF6 WebApi에서 엔티티를 병합하십시오
-
20-12-2019 - |
문제
나는 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
객체의 필드를 업데이트하거나 Person
및 PersonNames
를 사용하여 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>
제휴하지 않습니다 StackOverflow