C# 实体框架:EF始终保存值”;“在上面”;旧价值观

C# 实体框架:EF始终保存值”;“在上面”;旧价值观,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,在我使用Entity Framework的ASP.NET MVC应用程序中,我在保存时发现了一个奇怪的行为。我有一个视图,在那里我检查数据库中是否存在客户,如果这是真的,他们将与他们的数据一起显示在表中。很好。用户可以将更多客户添加到表中,以一个小示例说明: 数据库包含客户John和Jim。它们显示在表中。用户向表中添加了两个客户:Peter和Jack,因此现在表中应该包含客户:John、Jim、Peter和Jack 所以现在发生的是,当我将它们保存在我的控制器中时。获救的顾客是约翰、吉姆、约翰

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

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

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

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

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++;
}
以下是如何将现有客户添加到视图中的表中:

@{
    if (Model.Customers.Count() > 0)
    {

        foreach (var customer in Model.Cusomters)
        {
            <text>ArrayCustomers.push("@(customer.Name)");</text>
        }
    }
    else
    {
            <text>ArrayCustomers.push("");</text>
    }
}
    refresh_table();
@{
if(Model.Customers.Count()>0)
{
foreach(Model.Cusomters中的var客户)
{
ArrayCustomers.push(“@(customer.Name)”);
}
}
其他的
{
ArrayCustomers.push(“”);
}
}
刷新_表();

您应该为表中已经存在的每个客户添加一个id。然后,您将询问客户是否已保存,或者您可以筛选客户是否有id。如果客户没有id,则该id是新的,因此您可以保存它


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

这种行为一点也不奇怪。您的代码显示“对于表单中的每个名称,添加您在那里看到的名称。”您的表单列出了已经存在的两个条目的名称-可能在表单字段中。因此,当页面加载时,您可以让代码填充前两个表单字段(而不是手动填充),然后键入其他两个名称,EF只需将每个名称相加,总共4个名称。因此,您的数据库最终有6个名称和2个重复名称

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


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

它们在表中的显示方式取决于表的构造方式和使用的RDBMS。要以您想要的方式显示它们,只需使用
OrderBy