3

我想在使用實體框架的MVC控制器方法中添加新記錄。 當我剛剛使用「InsertOrUpdate」審計類型重複。根據Entity Framework adding record with a related object的回答,我希望修復它漂亮的qiock。這是我現在所擁有的代碼:使用實體框架添加記錄重複其他對象

控制器:

if (ModelState.IsValid) 
{ 
    Audit newAudit = Factory.GetNew(); 
    newAudit.Name = model.Name; 
    newAudit.Deadline = model.Deadline; 
    newAudit.AuditType = auditTypeRepository.Find(model.SelectedAuditTypeId); 

    Repository.InsertOrUpdate(newAudit); 
    Repository.Save(); 

    return RedirectToAction(MVC.Audits.Details(newAudit.Id)); 
} 

庫:

public override void InsertOrUpdate(Qdsa.WebApplications.AuditMaster.Data.Audit model) 
{ 
    if (model.Id == default(int)) 
    { 
     // New entity 
     context.Audits.Add(model); 
    } 
    else 
    { 
     // Existing entity 
     model.ModifiedOn = DateTime.Now; 
     context.Entry(model).State = EntityState.Modified; 
    } 
    //If I leave out the code below the AuditType will be duplicated 
    if (model.AuditType != null) 
    { 
     context.Entry<AuditType>(model.AuditType).State = EntityState.Unchanged; 
    } 
} 

public virtual void Save() 
{ 
    context.SaveChanges(); 
} 

所以我想我解決了這一問題。但是,AuditType也具有Child對象。現在這些小孩子被重複了。 添加具有已存在子對象的實體的正確方法是什麼? 因爲AuditType是必需的,我不能先保存它,然後更新它。有什麼建議麼?

UPDATE: 無論是AuditRepostory和AuditTypeRepository從BaseRepository繼承它具有上下文:

protected DBContext context = new DBContext(); 

public virtual T Find(int id) 
{ 
    return All.SingleOrDefault(s => s.Id == id); 
} 

回答

1

我可以想像兩個原因問題:

  • 無論auditTypeRepository.Find執行沒有跟蹤查詢(使用.AsNoTracking()
  • 或者您正在使用每個存儲庫的上下文實例,以便RepositoryauditTypeRepository正在處理兩種不同的上下文,這確實會導致AuditType的重複,因爲您沒有將其附加到與Repository(除了與您的評論相符的行)之外的上下文中。

如果後者是這種情況,您應該重新考慮您的設計,並將單個上下文實例注入所有存儲庫,而不是在存儲庫內創建它。

+0

我已經更新了我的問題。我必須執行具有上下文的單元工作並將其傳遞給存儲庫嗎? – amaters

+0

感謝您的指針。你剛剛救了我的一天! – amaters

0

我認爲這個問題是從這裏:

newAudit.AuditType = auditTypeRepository.Find(model.SelectedAuditTypeId); 

變化是這樣的:

newAudit.AuditTypeId = model.SelectedAuditTypeId;