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();
4

3 回答 3

2

我认为是因为您从与您保存的上下文不同repo的上下文中检索医学领域 -与formRepository; formRepository不跟踪由 创建的对象repo,因此它假定它是一个新对象,从而创建一个重复条目。出于性能原因,我不相信 Entity Framework 会为您插入存在检查——跟踪由对象上下文本身在内部处理;每个对象都绑定到单个对象上下文。尝试使用相同的存储库来检索MedicalPlan和写回 new 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(); 
} 
于 2012-07-31T18:16:24.373 回答
0

请尝试将 SaveChanges 与 SaveOptions 枚举一起使用,而不是 formRepository.SaveChanges()

例子:

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

请参阅链接了解更多信息http://msdn.microsoft.com/en-us/library/dd395500.aspx

于 2012-07-31T16:52:13.440 回答
0

使用IList<...>而不是ICollection<...>您的一对多关联可能会导致它出现故障。尝试改变它。除此之外,它可能是CoverageLevelRepository您未发布的代码。有关关联的更多信息,请参阅本指南

于 2012-07-31T16:55:20.923 回答