我正在使用实体框架和代码开发项目。这是我缩短的课程
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();
答案 0 :(得分:2)
我认为,因为您从不同的背景中检索医疗字段而不是您正在保存的医疗字段 - repo
与formRepository
; 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