【问题标题】:The UPDATE statement conflicted with the FOREIGN KEY constraint in asp.net mvc 5UPDATE 语句与 asp.net mvc 5 中的 FOREIGN KEY 约束冲突
【发布时间】:2015-02-02 08:13:43
【问题描述】:

我收到此错误:

UPDATE 语句与 FOREIGN KEY 约束“FK_TitleMember”冲突。冲突发生在数据库“ParishDBSQL”、表“dbo.Titles”、列“title_id”中。 声明已终止。

控制器

采取行动

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,但我收到如上所示的错误。

【问题讨论】:

    标签: c# mysql sql asp.net asp.net-mvc


    【解决方案1】:

    我认为错误在这一行

    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.SaveChanges();之前进行其他更改,通常我会使用db.Entry(member).State = EntityState.Modified;

    2. member 已附加到您的表。为什么db.Members.Attach(member);

    更新

    改变

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

    进入

    @Html.DropDownListFor(m =&gt; m.title_id, (SelectList) ViewBag.Titles)

    因为ViewBag是一个动态对象

    【讨论】:

    • member.title_id = vm.title_id 但它在这里是因为它给了我 0 而不是有效数字,而且您所做的代码与我的相同
    • 尝试我写的第二种方法
    • 确保vm.title_id 存在于您的主表中!
    • 是的。和 db.Entry(member).State = EntityState.Modified;我将此 1 用于我要保存的其他数据。
    • 您确定该值存在于主表中吗?也许你还没有执行db.SaveChanges()
    【解决方案2】:

    问题是视图中的下拉列表。你真的想这样初始化它:

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

    您现在初始化它的方式会导致所选值作为查询字符串参数传递 - 例如,您应该看到 URL 被发布为 ...?Titles=1

    【讨论】:

    • 我在运行项目之前就收到了这个错误“没有名为'DropDownListFor'的适用方法,但似乎有一个名为'DropDownListFor'的扩展方法。扩展方法不能动态调度。考虑强制转换动态参数或者在没有扩展方法语法的情况下调用扩展方法。”
    猜你喜欢
    • 2023-03-06
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多