2011-04-18 7 views
0

저는 ASP.NET MVC3을 데이터 레이어 LinqToSql로 사용합니다. 나는 엔티티를 어떻게 편집 할 수 있을지 조금 혼란 스럽다. 편집에서LinqToSql MVC3 업데이트

public ActionResult Edit(int id) 
{ 
    var product = _repository.GetById(id); 
    return View(product); 
} 


[HttpPost] 
public ActionResult Edit(Product product) 
{ 
    if (ModelState.IsValid) 
    { 
     _repository.EditProduct(product); 
     return RedirectToAction("Index"); 
    } 
    return View(); 
} 

변수 제품은() 확인하지만, 편집 후 링크 속성에서 널 (null)이 내의 DataContext에서 분리 될 것으로 보인다 편집 [HttpPost]에 전달 된 변수를 볼 수 있습니다. 또한 엔티티를 업데이트하기 위해 EditProduct 메서드에서 어떤 코드를 실행해야합니까?

감사합니다.

답변

1

귀하의 저장소에 귀하의 데이터 컨텍스트에 대한 개체가 있다고 가정합니다. 당신이 할 수없는 경우

dataContext.Products.Attach(product,true); 
dataContext.SubmitChanges(); 

:

Product prod = dataContext.Products.Single(p=>p.ProductID == product.ProductID); 

prod.PropertyA = product.PropertyA; 
prod.PropertyB = product.PropertyB; 
dataContext.SubmitChanges(); 

(당신이 타임 스탬프 열이있는 경우) 또한 들어오는 제품을 부착하고 저장할 수 있습니다 : 당신의 EditProduct에서 당신이 뭔가를해야 전화 타임 스탬프 열을 입력하면 L2S는 상태를 확인할 수 없다는 오류를 발생시킵니다.

엔티티는 버전 구성원을 선언하거나 업데이트 확인 정책이없는 경우 원래 상태가 아닌 수정 된 상태로만 첨부 할 수 있습니다.

DB에 타임 스탬프 열을 추가하면 L2S가 위의 작업을 수행 할 수 있습니다.

Here's a deeper explanation.

+0

좋은 대답을 맞는 방법을 발견하지만, .First 메서드를 사용하면 여기에 잘못된 것입니다. 두 개 이상의 엔터티가 쿼리와 일치하는 경우 무시됩니다. 대개 기본 키를 사용하면 그 일이 멈추지 만 자신을 열어두기를 원하지는 않습니다. Single 또는 SingleOrDefault를 대신 사용하십시오. – Milimetric

+0

죄송합니다. 좋은 지적 ... 코드를 수정하여 ...-) – klabranche

+0

속성을 모두 반복해야합니까? –

1
public void EditProduct(Product product) { 
    using (var context = new MyContext()) { 
     var dbProduct = context.Product.Single(r => r.Id == product.Id); 
     dbProduct.Property = product.Property; 
     dbProduct.ProductCategory = context.ProductCategory.Single(r => r.Id == product.ProductCategoryId); 
     context.SubmitChanges(); 
    } 
} 
  1. HTTP 요청 매개 변수에서 제품의 인스턴스를 생성합니다 귀하의 편집 (제품 제품) 방법. 리플렉션을 사용하고 Product 클래스의 속성을 살펴보면 HTTP 요청과 일치하는 것을 볼 수 있습니다. 이것은 모델 바인딩이라고 불리며 모델 바인딩을 자세히 살펴보면 모델 바인딩이 어떻게 작동하는지 알 수 있습니다. 제품 인스턴스가 링크가없고 컨텍스트에서 분리 된 이유는 그것이 새로운 일반 오브젝트로 작성 되었기 때문입니다.
  2. EditProduct 코드는 위와 유사 할 수 있습니다.

이 (가 핸들 예외, 검증 등을 위의 코드를 만들어 독자들에게 연습으로 남아가)

+0

하지만 편집 된 링크 속성은 어떻게 저장합니까? –

+0

@ Vladimir-nani 편집 된 링크 속성이 null이라는 것은 무엇을 의미합니까? 값으로 전달하려고하는 편집 하이퍼 링크가 있다는 것을 의미합니까? null입니까? – klabranche

+1

@Vladimir과 @klabranche : 아니오, @Vladimir이 두 테이블 (예 : Product 및 ProductCategory) 간의 관계를 편집하는 것에 대해 이야기하고 있다고 생각합니다. 그래서 그 예를 보여주기 위해 위의 코드를 편집했습니다. – Milimetric

0

내가 가장 내 요구

public ActionResult Edit(int id) 
{ 
    ViewBag.Categories = _repository.GetAllCategories(); 
    var product = _repository.GetById(id); 
    return View(product); 
} 


[HttpPost] 
public ActionResult Edit(int id, FormCollection collection) { 
    var product = _repository.GetById(id); 
    if (TryUpdateModel(product)) { 
     _repository.Commit(); 
     return RedirectToAction("Index"); 
    } 
    ViewBag.Categories = _repository.GetAllCategories(); 
    return View(product); 
}