2012-01-25 89 views
1

我正在使用MVC和實體框架代碼優先建立應用程序。ASP.NET MVC代碼首先創建重複記錄

我使用初始化程序來填充數據庫,當它通過對模型的任何更改重新創建時。

我在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"); 
    } 

我正在從倉庫現有的服務,分類和AllocatedTo,但是當涉及到保存記錄,而不是鏈接到現有的服務,類別等,它創造了一個新紀錄這是一個現有的重複。

我沒有真正解釋得很好。但如果你能提供任何幫助,我們將非常感激。

謝謝。

+0

聽起來像是對這一事件的服務和類別記錄實際上並沒有連接到的DbContext。在存儲庫中使用的DbContext與控制器中的DbContext不相同,或者存儲庫正在返回分離的實體。 repositry.GetService究竟是什麼樣子的 - 它是否使用與您的控制器相同的DbContext? – Leniency

+0

@Leniency,是存儲庫和控制器正在使用完全相同的上下文。 GetService()方法如下所示:'public Service GetService(int id) { return db.Services.SingleOrDefault(s => s.ServiceID == id); }' –

回答

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