2011-01-23 3 views
2

스택 오버플로 및 Google을 검색 할 때 내 상황에 대한 명확한 답을 찾지 못해 누군가가 올바른 방향으로 나를 가리킬 수 있습니다.MVC 및 EF4 CTP 모델 바인딩 및 저장 계층 적 모델

내가 ASP.NET MVC 3 및 ​​엔티티 프레임 워크 4 CTP를 사용하여 3 레벨 깊은 계층 개체를 업데이트 (단일 뷰에서) 하나의 편집 양식을 사용 할 수 있도록하려면 내 상황 (코드 - 첫 번째로) - 모델은 많은 서비스 옵션을 가질 수있는 서비스로 구성되며, 차례에는 많은 인벤토리 항목을 가질 수 있습니다.

  1. 업데이트 기존의 '서비스'기록
  2. 추가/업데이트/삭제 '를 서비스 옵션'기록 (첨부 : 나에 (TryUpdateModel를 통해) MVCs 기본 모델 바인더를 사용할 수 있도록 기대하고 있었다

    게시 된 값에 따라) 각 서비스 옵션에 부착 (게시 값
  3. 추가/업데이트/삭제 '재고'기록에 따라) 서비스에 대한

M Y 모델

[Bind(Include="Name, ServiceOptions")] 
public class Service { 
    [Key] 
    public int ServiceID { get; set; }  
    public string Name { get; set; }   
    public DateTime DateCreated { get; set; } 
    public virtual ICollection<ServiceOption> ServiceOptions { get; set; } 
} 

[Bind(Include="ServiceOptionID, Description, Tags")] 
public class ServiceOption { 
    [Key] 
    public int ServiceOptionID { get; set; } 
    public int ServiceID { get; set; } /* parent id reference */ 
    public string Description { get; set; } 
    public virtual ICollection<Inventory> InventoryItems { get; set; } 
} 


[Bind(Include = "InventoryID, Description")] 
public class Inventory { 
    [Key] 
    public int InventoryID { get; set; } 
    public int ServiceOptionID { get; set; } /* parent id reference */ 
    public string Description { get; set; } 
} 

이상적인 컨트롤러 방법 :

[HttpPost] 
public ActionResult EditService(int id) { 
    Service service = db.Services.Single(s => s.ServiceID == id); 
    TryUpdateModel(service); // automatically updates child and grandchild records 

    if (ModelState.IsValid) {    
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(service); 
} 

이 유토피아의 꿈을 달성 할 수있는 방법이 있나요, 아니면 내가 잘못 짚었 무엇입니까? 다른 기술 (예 : 일반 EF4, Automapper 등)을 사용할 수 있습니다.

미리 감사드립니다.

답변

0

그냥 기본 모델 바인더가 있습니까? 아마도 그렇지 않습니다.

맞춤 설정을 사용 하시겠습니까? 아마.

그러나 문제는 모델 바인더 자체가 아닙니다. 귀하의 문제는 EF와 ORM 및 일반적으로 컬렉션에서 삭제 작업으로 항목을 제거하는 것을 고려하지 않는다고 생각됩니다. 실제로 ORM에게 무엇을 말하고있는 것은 관계가 존재하지 않고 하위 행을 삭제해야한다는 것이 아닙니다. 매핑에 따라 일반적으로 "참조 무결성 제약 위반이 발생했습니다"와 같은 오류가 발생합니다. 이것은 코드 때문에 처음에는 EF가 작동하는 방식이 아닙니다.

EF는 설계 방식에 따라 작동하며, 다른 m2m 관계를 참조하는 m2m 관계가있는 경우와 같이 더 복잡한 관계에 실제로 중요합니다. EF가 관계 제거에 대한 호출을 명확하게하고 행을 완전히 제거하기를 원합니다.

또한 IMHO는 HTTP 값 매핑을 담당하는 코드 조각으로 개체를 유지하는 방법을 지정하기 때문에이 방법도 나쁘다. 이것은 나쁜 행동이다. 나는 삭제 작업을 꽤 신성 모독 행위로 간주하며 ModelBinder 만 남겨서는 안됩니다. 소프트 삭제 또는 로깅을 사용하지 않으면 "심각한 비즈니스"로 간주되어야합니다.

+0

감사합니다. 그렇다면 엔터티, 그 자녀 및 손자에게 업데이트를 가져온 단일 양식을 게시해야한다면 어떻게 할 것입니까? DTO와? 저장하기 전에 DTO 내용을 반영하도록 엔티티 그래프를 수동으로 업데이트 하시겠습니까? – Brendan