我的班级正在数据库中创建条目,我希望它停止

时间:2012-07-31 16:46:29

标签: c# entity-framework

我正在使用实体框架和代码开发项目。这是我缩短的课程

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; }
}

每个医疗计划中有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();

3 个答案:

答案 0 :(得分: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(); 
} 

答案 1 :(得分:0)

请尝试使用SaveChanges和SaveOptions Enum

而不是formRepository.SaveChanges()

示例:

ObjectContext.SaveChanges(
           System.Data.Objects.SaveOptions.DetectChangesBeforeSave
                   );

有关详情,请参阅链接http://msdn.microsoft.com/en-us/library/dd395500.aspx

答案 2 :(得分:0)

对于您的一对多关联,使用IList<...>代替ICollection<...>可能导致其出现故障。尝试改变它。除此之外,它可能是您CoverageLevelRepository中未发布的代码。有关关联的更多信息,请参阅this guide