我正在使用MVC和Entity Framework Code First构建应用程序。
我使用初始化程序在通过模型的任何更改重新创建数据库时填充数据库。
我遇到EF Code First创建重复记录的问题。最简单的解释方法是向您展示我的代码。
//
// POST: /Incident/CreateIncident
[HttpPost]
public ActionResult CreateIncident(IncidentViewModel model)
{
Incident incidentToAdd = new Incident();
// Record incident details
incidentToAdd.Caller = repository.GetDomainUser(model.selectedCaller);
incidentToAdd.CallerType = model.Incident.CallerType;
incidentToAdd.Service = repository.GetService(model.selectedService);
incidentToAdd.Category = repository.GetCategory(model.selectedCategory);
incidentToAdd.AllocatedTo = repository.GetHelpDeskMember(model.selectedAllocatedTo);
[Rest of code omitted to save space]
// TODO: Send Email to Caller and AllocatedTo
// Store incident in database
db.Incidents.Add(incidentToAdd);
db.SaveChanges();
return RedirectToAction("Index");
}
我从存储库获取现有的Service,Category和AllocatedTo,但是在保存记录时,而不是链接到现有的Service,Category等。它创建了一个与现有服务重复的新记录。
我没有真正解释得那么好。但如果你能提供任何帮助,我们将不胜感激。
感谢。
答案 0 :(得分:1)
我已经解决了这个问题。我不确定这是否是正确的方法,但我得到了我想要的结果。
现在我不是简单地将从数据库返回的实体添加到incidentToAdd,而是使用EntityState将实体指定为未更改。
Service service = repository.GetService(model.selectedService);
incidentToAdd.Service = service;
db.Entry(service).State = EntityState.Unchanged;
Category category = repository.GetCategory(model.selectedCategory);
incidentToAdd.Category = category;
db.Entry(category).State = EntityState.Unchanged;
HelpDeskMember allocatedTo = repository.GetHelpDeskMember(model.selectedAllocatedTo);
incidentToAdd.AllocatedTo = allocatedTo;
db.Entry(allocatedTo).State = EntityState.Unchanged;
我在此链接中找到了相关信息:Using DbContext in EF 4.1 Part 4: Add/Attach and Entity States