C# 使用相关的新记录更新EntityFramework记录

C# 使用相关的新记录更新EntityFramework记录,c#,asp.net-mvc,entity-framework,entity-framework-5,C#,Asp.net Mvc,Entity Framework,Entity Framework 5,我正在尝试使用一个附加到EF来更新我需要的所有记录 public void UpdateSale(Sale s) { Context.Sales.Attach(s); Context.Entry(s).State = System.Data.Entity.EntityState.Modified; Context.SaveChanges(); } 让我们这样说吧。上面的代码给了我一个错误,因为它说我试图添加的主键已经存在(它们还没

我正在尝试使用一个附加到EF来更新我需要的所有记录

public void UpdateSale(Sale s)
    {
        Context.Sales.Attach(s);
        Context.Entry(s).State = System.Data.Entity.EntityState.Modified;
        Context.SaveChanges();
    }
让我们这样说吧。上面的代码给了我一个错误,因为它说我试图添加的主键已经存在(它们还没有自动生成)

现在Sale内部有许多不同的其他实体模型,如: 储蓄形式,产品销售

现在调用UpdateSale的代码就在这里

        public JsonResult AddNewForms(string Anamaka, string NispahB, string Hazaot, string ManufactorerID, string ClientStatus, string TypeFile)
    {
        BL.FormConnectorLogic fcl = new BL.FormConnectorLogic();
        DAL.SavedForm AnamakaForm = MakeSavedForm(Boolean.Parse(Anamaka),"מסמך הנמקה",ClientStatus);
        DAL.SavedForm NispahBForm = MakeSavedForm(Boolean.Parse(NispahB), "נספח ב", ClientStatus);
        DAL.SavedForm HazaotForm = MakeSavedForm(Boolean.Parse(Hazaot), TypeFile, ClientStatus, ManufactorerID);
        var results = new { A = AnamakaForm, N = NispahBForm, H = HazaotForm  };
        return Json(results, JsonRequestBehavior.AllowGet);
    }

    public DAL.SavedForm MakeSavedForm(bool Authorized, string FormName, string ClientStatus, string ManufactorerID = "")
    {
        DAL.Sale s = (DAL.Sale)Session["SaleSave"];
        DAL.SavedForm sf = new DAL.SavedForm();
         if (Authorized)
         {
            sf = new DAL.SavedForm();
            sf.FormName = new BL.FormConnectorLogic().getFormByName(FormName, ClientStatus, ManufactorerID).FormName;
            sf.DateFormed = DateTime.Now;
            sf.AgentID = s.AgentID;
            sf.Status = "פתוח";
            sf.SaleID = s.ID;
            s.SavedForms.Add(sf);
            new BL.SaleLogic().UpdateSale(s);
            Session["SaleSave"] = s;
            return sf;
        }
        else return null;

}
现在我已经阅读了状态,添加和修改之间存在差异。 虽然我似乎真的不知道我什么时候要添加,什么时候要修改。
不管怎样,是否可以忽略所有内容,将我的整个类及其所有关系都推到数据库中?

您需要知道是要添加还是修改,EF无法神奇地解决这个问题。为了进行修改,您需要知道相关的主键值,否则您所能做的就是添加。但是,知道主ID是否已经存在不是一个简单的问题吗?如果它没有添加或修改。问题是,它不在我的脑海中,我如何检查我是否需要修改或添加,或者如果我这样做了,何时附加和保存。这取决于你所说的存在是什么意思,如果你的PK是int,它将有一个默认值0,但EF不知道0是否是一个有效的PK。如果你能从逻辑上判断(例如,0是新记录,肯定是现有记录),那么你可以编写代码,根据需要添加或更新。我想我只是一厢情愿地认为有一个神奇的解决方案。不管怎样,谢谢。我会像你说的那样尝试。看看GraphDiff,它填补了EF在更新断开连接的对象图方面留下的空白。