2011-10-05 2 views
0

레코드를 업데이트하는 중에 문제가 있습니다. 웬일인지 컨트롤러에서 게시 작업을 수행하고 돌아 오는 것조차하지 않습니다. "동일한 키를 가진 항목이 이미 추가되었습니다."EF 4.1을 사용하여 MVC3보기가 업데이트되지 않습니다.

업데이트보다는 삽입 기능을하는 것처럼 동작하는 것처럼 보입니다. 이것에 대한 새로운 시각을 주셔서 감사합니다. 아마도 내가 놓친 것은 아주 간단 할 것입니다.

컨트롤러 :

// GET: /Manage/Regions/Edit/5 

    public ActionResult Edit(int id) 
    { 
     Region_CU regionEdit = (from r in db.Venues_Regions 
           where r.RegionsID == id 
           select new Region_CU 
           { 
             RegionsID = r.RegionsID, 
             Name = r.Name, 
             CalendarLink = r.CalendarLink, 
             MapIcon = r.MapIcon, 
             QtrStart = r.QtrStart, 
             QtrEnd = r.QtrEnd, 
             FacebookLikeBox = r.FacebookLikeBox, 
             FacebookId = r.FacebookId 
            // region = r 
           }).Single(); 
     return View(regionEdit); 
    } 

    // 
    // POST: /Manage/Regions/Edit/5 

    [HttpPost] 
    public ActionResult Edit(Region_CU r) 
    { 
     if (ModelState.IsValid) 
     { 
      var v = db.Venues_Regions.First(i => i.RegionsID == r.RegionsID); 
       //v.RegionsID = r.RegionsID; 
       v.Name = r.Name; 
       v.CalendarLink = r.CalendarLink; 
       v.MapIcon = r.MapIcon; 
       v.QtrStart = r.QtrStart; 
       v.QtrEnd = r.QtrEnd; 
       v.FacebookLikeBox = r.FacebookLikeBox; 
       v.FacebookId = r.FacebookId; 
      //Venues_Regions v = new Venues_Regions 
      //{ 
      // RegionsID = r.RegionsID, 
      // Name = r.Name, 
      // CalendarLink = r.CalendarLink, 
      // MapIcon = r.MapIcon, 
      // QtrStart = r.QtrStart, 
      // QtrEnd = r.QtrEnd, 
      // FacebookLikeBox = r.FacebookLikeBox, 
      // FacebookId = r.FacebookId 
      //}; 
      //db.Venues_Regions.Attach(v); 
      //db.ObjectStateManager.ChangeObjectState(v, EntityState.Modified); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(r); 
    } 

보기 :

@model THPT_Razor.Areas.Manage.Models.Region_CU 

@{ 
ViewBag.Title = "Edit Region"; 
} 

<h2>Edit</h2> 
<link href="@Url.Content("~/Content/themes/base/jquery.ui.all.css")" rel="stylesheet" type="text/css" /> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> </script> 
<script> 
    $(document).ready(function() { $('.date').datepicker({ dateFormat: "mm/dd/yy" }); }); 
</script> 
@using (Html.BeginForm()) { 
    @* @Html.ValidationSummary(true)*@ 
<fieldset> 
    <legend>@Html.DisplayFor(model => model.Name)</legend> 

    @Html.HiddenFor(model => model.RegionsID) 
    @Html.HiddenFor(model => model.Name) 
    @Html.HiddenFor(model => model.CalendarLink) 
    <div class="editor-label"> 
     @Html.Label("Map Icon") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.MapIcon, new SelectList(Model.mapicons,"id","Description")) 
    </div> 
    <div class="editor-label"> 
     @Html.Label("Quarter Start") 
    </div> 
    <div class="editor-field"> 
     @Html.TextBoxFor(model => model.QtrStart, new { @class = "date" }) 
     @Html.ValidationMessageFor(model => model.QtrStart) 
    </div> 

    <div class="editor-label"> 
     @Html.Label("Quarter End") 
    </div> 
    <div class="editor-field"> 
     @Html.TextBoxFor(model => model.QtrEnd, new { @class = "date" }) 
     @Html.ValidationMessageFor(model => model.QtrEnd) 
    </div> 

    <div class="editor-label"> 
     @Html.Label("Region Facebook ID") 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.FacebookId) 
     @Html.ValidationMessageFor(model => model.FacebookId) 
    </div> 
    <div class="editor-label"> 
     @Html.Label("Region Facebook LikeBox Code") 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.FacebookLikeBox) 
     @Html.ValidationMessageFor(model => model.FacebookLikeBox) 
    </div> 
    <p> 
     <input type="submit" value="Update" /> 
    </p> 
</fieldset> 

편집 :

제가받은 여러 가지 좋은 제안하지만 난이 명확하지 않은 것 같아요. Region_CU는 엔티티가 아닙니다. Venues_Regions는 내가 업데이트하려고하는 것입니다. 아래 클래스에있는 설명을 참조하십시오. 최초의 목표는 Venues_Regions 객체와지도 아이콘에 대한 목록 객체가있는 간단한 래퍼를 작성하는 것이 었습니다. 그러나 Likebox 필드의 데이터 주석은 전달되지 않아서 Venues_Regions 객체가 분리되었습니다. 이제 업데이트를 저장하려고 할 때 http 게시 작업을 수행하지 않습니다. 이 일이 내가 이루고자하는 것을 정리하고 도움을 청하기를 바란다. 모든 도움과 빠른 답변에 다시 한 번 감사드립니다.

//create and update 
public class Region_CU 
{ 

    public Region_CU() 
    { 

    } 
    public List<MapIcon> mapicons { get; set; } 
    //public Venues_Regions region { get; set; } 

    // The fields below are what makes up Veunes_Region 
    // this was broken out from the above Venues_Region 
    // because the UIHint was not being passed through 
    public int RegionsID { get; set; } 
    public string Name { get; set; } 
    public string CalendarLink { get; set; } 
    public int MapIcon { get; set; } 
    public DateTime? QtrStart { get; set; } 
    public DateTime? QtrEnd { get; set; } 

    [UIHint("tinymce_jquery_full"), AllowHtml] 
    public string FacebookLikeBox { get; set; } 
    public string FacebookId { get; set; } 
    public string mapIcon { get; set; } 

} 

편집 # 2 : 좋은 밤 후 솔루션 자체를 발표 잔다. 업데이트 작업에서 내가 할 일은 전달되는 래퍼에서 전달되는 Venues_Region 개체로의 변경이었습니다. 이제는 모든 것이 작동합니다.

모든 도움과 제안에 감사드립니다. 도움에 미리

감사합니다, 크리스

+0

EF 4.1 로의 이전을 고려하셨습니까? DbContext API를 사용하면 필요한 모든 것을 쉽게 업데이트 할 수 있습니다. – tugberk

답변

0

은 실제로 당신이 오직 할 필요가있는 장소를로드하고 TryUpdateModel를 호출합니다. 당신은 객체를 전달할 필요조차 없습니다. 그런 다음 회장을 저장하십시오. 또 다른 방법은 automapper를 사용하여 객체간에 필드를 복사하거나 언급 된대로 attach 메소드를 사용하지만 수동 필드 복사가 필요하지 않습니다.

+0

팁 아담 감사합니다. 그러나 문제는 래퍼를 모든 혼란을 야기한 개체가 아닌 업데이트 작업으로 다시 전달한 것입니다. 나는 attach 메소드와 UpdateModel과 TryUpdateModel의 예제를 사용했지만 automapper는 무엇입니까? – Chris

+0

Automapper는 코드 플렉스에 있으며 일반적으로 MVC에서 속성 이름과 일치하는 한 객체에서 다른 객체로 필드를 복사하는 데 사용됩니다. 그것을 확인해보십시오, 모든 소품을 복사하는 두 줄의 코드는 꽤 좋습니다. –

관련 문제