无法将对象添加到context.DbSet。 SaveChanges不起作用

时间:2015-04-28 20:56:33

标签: c# asp.net entity-framework

我在控制器中有这个GET方法:

public ActionResult Reserve(int id)
{
    ViewBag.staffID = new SelectList(context.Staffs, "staffID", "fName");
    ViewBag.roomID = id;
    return View();
}

相应的观点:

@model _00002165.Models.Reservation

@{
    ViewBag.Title = "Reserve";
}

<h2>Reserve</h2>
 @using (Html.BeginForm()) {
    @Html.ValidationSummary(true)


    <div class="editor-label">
        <label>Room Number</label>
    </div>
    <div class="editor-field">
        <input type="text" value="@ViewBag.roomID" readonly name="roomID"/>
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.fromDate)
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.fromDate)
        @Html.ValidationMessageFor(model => model.fromDate)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.toDate)
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.toDate)
        @Html.ValidationMessageFor(model => model.toDate)
    </div>

    <div class="editor-label">
        <label>Staff:</label>
    </div>
    <div class="editor-field">
        @Html.DropDownList("staffID", "Select Staff")
        @Html.ValidationMessageFor(model => model.staffID)
    </div>

   <button type="submit">Reserve</button>
}

我想用这些POST方法保存这些输入的数据:

[HttpPost]
public ActionResult Reserve(Reservation res)
{
    if (ModelState.IsValid)
    {
        var customer = context.Customers.First(x => x.username == User.Identity.Name);
        res.customerID = customer.customerID;
        context.Reservation.Add(res);
        context.Entry(res).State = EntityState.Modified;
        context.SaveChanges();
        return RedirectToAction("Index");
    }
}

这给了我以下错误:

Store update, insert, or delete statement affected an unexpected number of rows (0).

人们建议我在我的视图中添加@Html.HiddenFor(model => model.reservationID)

但是model.reservationID是空的。

我该如何解决这个问题? 请帮忙

2 个答案:

答案 0 :(得分:0)

您不应该将数据传输对象传递给视图或从视图传递数据传输对象。使用ToModel方法创建一个视图模型,该方法将返回所需的DTO。添加到上下文中,您无需更改状态。

使用此

context.Reservation.Add(res);
context.SaveChanges();

去除

context.Entry(res).State = EntityState.Modified;

如果您要更新,请从数据库中提取记录,进行更改并调用SaveChanges

答案 1 :(得分:0)

context.Entry(res).State = EntityState.Modified;

此行不是必需的 - 如果您手动将某些内容标记为已修改,则会出现这种情况。由于您要添加一个全新的实体,因此正确的值为Added,默认情况下应该存在。

似乎是在尝试update而不是insert,这会导致错误。