使用Entity Framework保存更改会导致分离的实体重复

时间:2012-08-28 15:12:52

标签: asp.net asp.net-mvc-3 entity-framework entity-framework-4

我正在制作一个调查程序,其中包含从数据库中作为实体提取的问题列表。在调查过程中,可以编辑实体的属性,但我不希望这些更改持久存储到数据库中。因此,我将这些问题加载到dbcontext后将其分离,并通过字典访问它们。

当我尝试保存数据库的答案时出现问题。由于答案实体与问题实体(已分离)相关,因此将全新的问题实体添加到数据库中。我不确定为什么会发生这种情况,因为添加的答案实体包含分离实体的正确ID(当我在调试器中查看它时)。但是,保存更改后,它会更新为新创建的重复实体的ID。

有没有办法阻止这种行为?或者,是否有一种方法可以对实体进行更改,即使在上下文中调用SaveChanges以将答案或日志条目写入数据库时​​,也不会将它们持久保存到数据库中?

这是加载的代码,然后分离问题(项目):

 public FixedLengthBlockElementRuntime(FixedLengthBlock block, RuntimeContext context) : base(block, context)
    {
        this._items = ((FixedLengthBlock)this.Element).ItemBank.Items.OfType<FixedLengthItem>().ToDictionary(x => x.ItemName, x => x);


        foreach(FixedLengthItem fixedLengthItem in this._items.Values)
        {
            this.Context.DetachEntity(fixedLengthItem);
        }
    }

以下是添加重复条目的代码:

    public void SetResponse(Response response)
    {
        response.Session = this.Session;
        this.DbContext.Responses.AddObject(response);
        this.DbContext.SaveChanges();
    }

请注意,在保存更改之前,Response具有正确的ItemId。

1 个答案:

答案 0 :(得分:1)

您可以将问题DbSet上的MergeOption设置为OverwriteChanges。

Context.Questions.MergeOption = MergeOption.OverwriteChanges;

您需要确保在对问题进行查询之前将其设置为正常工作。

关于MergeOptions如何运作的

More reading