2014-12-04 122 views
4

我收到此錯誤:UPDATE語句衝突與asp.net的MVC外鍵約束5

The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_TitleMember". The conflict occurred in database "ParishDBSQL", table "dbo.Titles", column 'title_id'. The statement has been terminated.

控制器

取得動作

public ActionResult Edit(int? id) 
    { 
     var member = (from h in db.Members 
     join f in db.Titles on h.title_id equals f.title_id 
         where h.m_id == id 
         select new 
         { 
          title_id = h.title_id, 
         }).First(); 
var viewmodel = new MembersViewModel(); 
     viewmodel.title_id = member.title_id; 
ViewBag.Titles = new SelectList(db.Titles.ToList(), "title_id", "Titles", viewmodel.title_id); 

return View(viewmodel); 

    } 

發帖行動

public ActionResult Edit(MembersViewModel vm) 
    { 
     if (ModelState.IsValid) 
     { 
var member = db.Members.Find(vm.m_id); 
      member.title_id = vm.title_id; 
    ViewBag.Titles = new SelectList(db.Titles.ToList(), "title_id", "Titles", vm.title_id); 

       db.Members.Attach(member); 
       db.Entry(member).State = EntityState.Modified;  
db.SaveChanges(); 

       return RedirectToAction("Index"); 

     } 

     return View(vm); 

查看

<div class="col-md-4"> 
      <div class="form-group"> 
       <label>Title</label> 

       @Html.DropDownList("Titles") 
       @Html.ValidationMessageFor(model => model.title_id) 
      </div> 
     </div> 

型號

public partial class Title 
    { 
    public Title() 
    { 
     this.Heads = new HashSet<Head>(); 
     this.Members = new HashSet<Member>(); 
    } 

    public int title_id { get; set; } 
    public string Titles { get; set; } 

    public virtual ICollection<Head> Heads { get; set; } 
    public virtual ICollection<Member> Members { get; set; } 
} 

視圖模型

public class MembersViewModel 
{ 
    public int m_id { get; set; } 
    public string titles { get; set; } 
    public int title_id { get; set; } 
} 

我想使用我的成員表格表上的下拉列表來更新title_id,但是我得到上面顯示的錯誤。

回答

3

我認爲錯誤是在這一行

member.title_id = vm.title_id 

也許vm.title_id它不是在主表中找到,它不可能是一個外鍵。檢查這個變量的正確值

如果它不能解決你的問題看你的代碼我看到一些我不明白的東西。

試圖改變這樣的代碼

if (ModelState.IsValid) 
{ 
    var member = db.Members.Find(vm.m_id); 
    member.title_id = vm.title_id; 
    ViewBag.Titles = new SelectList(db.Titles.ToList(), "title_id", "Titles", vm.title_id); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 
  1. 我通常使用db.Entry(member).State = EntityState.Modified;,如果我有以前db.SaveChanges();

  2. member做其他的變化已經attched您的餐桌。爲什麼你db.Members.Attach(member);

更新

變化

@Html.DropDownListFor(m => m.title_id, ViewBag.Titles) 


@Html.DropDownListFor(m => m.title_id, (SelectList) ViewBag.Titles)

因爲ViewBag是達因amic object

+0

member.title_id = vm.title_id但它是在這裏,因爲它給了我0,而不是一個有效的數字和你做的代碼是與我同 – ninjaXnado 2014-12-04 12:59:35

+0

所以解決您的問題:) – faby 2014-12-04 13:00:07

+0

沒有它給了我同樣的錯誤 – ninjaXnado 2014-12-04 13:01:33

1

問題是視圖中的下拉列表。你真的想要初始化它是這樣的:

@Html.DropDownListFor(m => m.title_id, ViewBag.Titles) 

你現在初始化它的方式會導致作爲查詢字符串參數傳遞選擇的值 - 你會看到URL被張貼爲...?Titles=1例如。

+0

即使在我運行該項目之前,我得到了這個錯誤「沒有可用的方法名爲'DropDownListFor',但似乎有一個名稱爲擴展方法。擴展方法不能動態調度。調用沒有擴展方法語法的擴展方法「。 – ninjaXnado 2014-12-04 13:25:21

+0

其工作非常感謝你,但只是添加(SelectList) – ninjaXnado 2014-12-04 13:39:39