实体框架:EF始终将值保存在旧值的“顶部”

时间:2017-03-13 22:32:30

标签: c# asp.net asp.net-mvc entity-framework

在我使用Entity Framework的ASP.NET MVC应用程序中,我在保存时发现了一种奇怪的行为。我有一个视图,在那里我检查数据库中的客户是否存在,如果这是真的,它们将与他们的数据一起显示在表中。工作良好。用户可以向表中添加更多客户,以说明一个小例子:

数据库包含客户John和Jim。它们显示在表格中。用户在表中添加了两个客户:Peter和Jack,所以现在表中应该包含客户:John,Jim,Peter和Jack。

所以现在发生的是,当我将它们保存在我的控制器中时。被拯救的顾客是约翰,吉姆,约翰,吉姆,彼得和杰克。实体框架似乎在客户之前添加了那些,但这不是我想要的,我只想保存这些客户,就像它们显示在表格中一样。我希望你能帮助我解决这个问题。

以下是我的控制器中用于保存客户的代码:

<button class="btn">&#9776;</button>

以下是我如何将现有客户添加到视图中的表格中:

var counter = 0;
string customerName = "";

while (true)
{
customerName = Request.Form["CustomerName[" + counter + "]"];
if (customerName == "" || customerName == null)
{
   break;
}
Customer customer = new Customer();
customer.OverviewID = CustomerOverview.ID;
customer.Name = customerName;
db.Customer.Add(customer);
db.SaveChanges();
counter++;
}

2 个答案:

答案 0 :(得分:1)

这种行为一点都不奇怪。您的代码说&#34;对于表单中的每个名称,添加您在那里看到的名称。&#34;您的表单列出了已存在的两个条目的名称 - 可能在表单字段中。因此,当页面加载时,您的代码会填充前两个表单字段(而不是手动执行),然后键入其他两个名称,EF只添加每个表单,共4个名称。所以你的数据库最终会有6个名字和2个副本。

避免这种情况的方法是不将表单字段中已有的名称加载。这样,当您点击提交按钮时,它们就不会被提交。对于您仅在页面上显示的项目,您应@DisplayFor;对于要添加的项目,您应@EditorFor

与您的问题相关 - 我不确定您为什么不遵循常规的MVC模式,但如果您不这样做,它会增加您的痛苦。你没有列出你的表单html代码的样子,这可能会导致你的问题被低估。

答案 1 :(得分:0)

您应该为已存在的表中的每个客户添加一个ID。然后,您将询问客户是否已保存,或者您可以过滤客户是否具有ID。如果客户没有id,那么它是新的,所以你保存它。

当您使用mvc时,我建议您发布一组客户并使用模型绑定,而不是从请求中获取值。