2012-07-31 21 views
0

我正在使用實體框架和代碼優先使用一個項目。這裏是我縮短的類我的課在數據庫中創建條目,我希望它停止

public class BenefitsForm : IAnnualForm, IAuditable 
{ 
    public BenefitsUser UserInfo { get; set; } 
    public CoverageLevel Medical { get; set; } 
} 

public class MedicalPlan : IHealthPlan 
{ 
    public int Id { get; set; } 
    public virtual IList<CoverageLevel> CoverageLevels { get; set; } 
} 

public class CoverageLevel 
{ 
    public int Id { get; set; } 
    public virtual MedicalPlan MedicalPlan { get; set; } 
} 

在每個MedicalPlan有4個覆蓋水平。我已經有了數據庫中的覆蓋率和醫療計劃。但是,當我創建我的BenefitsForm時,它會爲這些類創建重複的條目(我已經在數據庫中擁有它們)。我怎樣才能阻止它做到這一點?這裏有一個小代碼片段來展示它是如何發生的。

BenefitsForm form = new BenefitsForm() { UserInfo = new BenefitsUser() }; 
using(var repo = new CoverageLevelRepository()) 
{ 
    form.Medical = repo.Retrieve(new NumericKey(formId))); //this retrieves the coveragelevel with the id I want. 
} 
formRepository.Create(form); // this creates a duplicate med plan and 4 duplicate coverage levels. 
formRepository.SaveChanges(); 
+0

如果您知道在數據庫中創建重複條目的方法,請在創建數據庫之前確認它不存在。 – 2012-07-31 18:00:20

回答

2

我想是因爲你從不同的上下文比你在拯救一個檢索醫學領域 - repoformRepository; formRepository沒有跟蹤由repo創建的對象,因此它假設它是一個新對象,並因此創建了重複條目。出於性能方面的原因,我不相信實體框架將會爲您插入存在檢查 - 跟蹤由對象上下文自身內部處理;每個對象都綁定到單個對象上下文。嘗試使用相同的存儲庫檢索MedicalPlan並回寫新的BenefitsForm,並且不應該有重複。

BenefitsForm form = new BenefitsForm() { UserInfo = new BenefitsUser() }; 
using(var repo = new Repository()) 
{ 
    form.Medical = repo.Retrieve(new NumericKey(formId))); //this retrieves the coveragelevel with the id I want. 
    repo.Create(form); // this creates a duplicate med plan and 4 duplicate coverage levels. 
    repo.SaveChanges(); 
} 
0

這是可能使用IList<...>而不是ICollection<...>,因爲您的一對多關聯導致其發生故障。試着改變它。除此之外,它可能是您沒有發佈的CoverageLevelRepository內的代碼。有關協會的詳細信息,請參閱this guide

+0

將所有類作爲「可序列化」會導致問題嗎? – proseidon 2012-07-31 17:03:15

相關問題