웹 API 2 및 EF6을 사용하여 API를 작성하는 중에 비슷한 문제점이 최근에 발생했습니다.
많은 필드가있는 엔티티가 있는데 json에서 수신되는 필드 만 업데이트하려고합니다. 나는에서 JSON을 읽어 함수 호출
public IHttpActionResult Update(int id){ ... }
에서 제품을 제거
public IHttpActionResult Update(int id, Product product) { ... }
:
그래서 대신 ASP 디시리얼라이저를 사용하여 수신의 목적은 그래서 같은
를 구문 분석 요청 기관
var rawBody = Request.Content.ReadAsStringAsync().Result;
디시리얼라이저
Dictionary<string, string> rawProduct = JsonConvert
.DeserializeObject<Dictionary<string, string>>(rawBody);
업데이트 필드 사전
rawProduct.Remove("Id");
제품을 연결에서 아이디 키를 제거 업데이트 객체를
var product = JsonConvert.DeserializeObject<Product>(rawBody);
빌드 필드와 값을 사전에 JSON 내용 문맥에
dbContext.Products.Attach(product);
개체의 모든 속성을 반복하면 해당 개체가 사전에 있는지 확인하고 수정 된 특성을 true로 설정합니다.
foreach(var p in product.GetType().GetProperties()){
if(rawProduct.ContainsKey(p.Name)) {
dbContext.Entry(product).Property(p.Name).IsModified = true;
}
}
전체 코드 : @klimslava에서 솔루션
public IHttpActionResult Update(int id){
var rawBody = Request.Content.ReadAsStringAsync().Result;
Dictionary<string, string> rawProduct = JsonConvert
.DeserializeObject<Dictionary<string, string>>(rawBody);
var product = JsonConvert.DeserializeObject<Product>(rawBody);
rawProduct.Remove("Id");
dbContext.Products.Attach(product);
foreach(var p in product.GetType().GetProperties()){
if(rawProduct.ContainsKey(p.Name)) {
dbContext.Entry(product).Property(p.Name).IsModified = true;
}
}
dbContext.SaveChanges();
}
를 얻을 것이다 (이 인라인 편집) 자바 스크립트를 통해 클라이언트에서 수정 된 필드를 추적하고 목록에 포함에 귀하의 POST 요청. 그것은 꽤 광범위한 주제입니다. –
감사합니다 @AntP, 올바른 방향으로 나를 가리 키시겠습니까? 클라이언트의 수정 된 필드를 추적하여 컨트롤러의 정보를 얻고 싶습니다. –
모델 구조가 어쨌든 _simple_ 인 경우이 게시물에서 설명한 것과 비슷하게 할 수 있습니다. [모든 속성의 속성을 반복적으로 반복하여 두 객체 비교] (http://stackoverflow.com/a/25064247/1207195). –