2012-07-31 23 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

相关问题