我配置了一个编辑操作,它不会更新记录但不会抛出任何异常。更新似乎有效,但更改未反映在数据库中。
我正在使用EF和MVC3,我有一个定义保存客户的界面
public interface ICustomerRepository
{
//allows a sequence of customers to be displayed
IQueryable<Customer> Customers { get; }
//saves edits to customer records
void SaveCustomer(Customer customer);
}
然后我实现了这个
public void SaveCustomer(Customer customer)
{
if (customer.CustomerId == 0)
{
context.Customers.Add(customer);
}
context.SaveChanges();
}
然后在控制器中我的get和post动作
public ViewResult Edit(int customerId)
{
Customer customer = repository.Customers.FirstOrDefault(c => c.CustomerId == customerId);
return View(customer);
}
[HttpPost]
public ActionResult Edit(Customer customer)
{
if (ModelState.IsValid)
{
repository.SaveCustomer(customer);
TempData["message"] = string.Format("{0} has been saved", customer.CustomerName);
return RedirectToAction("Index");
}
else
{
//there is something wrong with the data values
return View(customer);
}
}
然后在我看来我有
@model CustomerOrders.Domain.Entities.Customer
@{
ViewBag.Title = "Admin: Edit" + @Model.CustomerName;
Layout = "~/Views/Shared/_AdminLayout.cshtml";
}
<h1>Edit @Model.CustomerName</h1>
using (Html.BeginForm("Edit", "Admin"))
{
<div class="left-column">
<div class="editor">@Html.EditorFor(model => model.CustomerId)</div>
<div class="label-for">@Html.LabelFor(model => model.CustomerName)</div>
<div class="editor">@Html.EditorFor(model => model.CustomerName)</div>
@Html.ValidationMessageFor(model => model.CustomerName)
</div>
<div class="middle-column">
<div class="label-for">@Html.LabelFor(model => model.PrimaryContactName)</div>
<div class="editor">@Html.EditorFor(model => model.PrimaryContactName)</div>
<div class="label-for">@Html.LabelFor(model => model.PrimaryContactNo)</div>
<div class="editor">@Html.EditorFor(model => model.PrimaryContactNo)</div>
</div>
<div class="right-column">
<input type="submit" value="Save" />
@Html.ActionLink("Cancel and return to list", "Index")
</div>
}
我还有一个连接到相同编辑操作和视图的创建方法,它可以正常工作。不确定我哪里出错了,我对MVC3不熟悉并且不确定我的编辑实现是否正确?
答案 0 :(得分:2)
简单的答案是因为您在无状态环境中工作,除非您使用自我跟踪实体,否则您需要Attach
对象到EF的图形。
我过去曾遇到编辑问题。所以我最后去DB拿取对象,然后合并我需要的更改,然后做Save。
您需要将创建/编辑操作分开。只需检查ID&gt; 0认为编辑是不够的,更明确。
总结一下:
总的来说,这是一种痛苦。许多开发人员(包括我自己)已经完成了你的工作。