当您明确加载DBSet时,为什么它首先删除现有元素?

时间:2014-08-02 15:16:36

标签: entity-framework

EF新手。试图找出“填充”DataSet的DataTable和“加载”DBSet之间的差异。

如果我填充DataSet的DataTable,则会删除“填充”之前存在的记录。这允许我只拥有DataTable中想要的记录。我也可以选择在“填充”之前删除记录。但是我可以控制DataTable中的内容。

当我明确“加载”DBSet时,它不会删除任何已经存在的实体,只需添加在顶部。因此,与DataTable不同,似乎DBSet逐渐填充。如果我“清除()”DBSet.Local,则Local.Count变为零,但清除的实体仍在某处(当我使用IsLoaded进行测试时)。并且,我似乎无法让他们回到.Local与另一个“负载”,因为他们已经加载。

Hmmmm。这是应该的吗?我必须将数据保存在内存中吗?我不能有选择地卸载实体(当然没有删除它们)并在以后重新加载它们吗?

2 个答案:

答案 0 :(得分:0)

找到有用的东西:

                Context.Entry(item).State = EntityState.Detached;

当你使用SaveChanges()时,这似乎从内存(和.Local)中删除了实体,而没有将其标记为从数据库中删除;

答案 1 :(得分:0)

你的问题令人困惑。 DbSet和DataTable不是同一个东西,你无法比较它们或它们的功能。究竟是什么意思" Loading"一个DbSet?三是在DbSet中没有Load方法,尽管有一个Load Extension方法除了用查询对象填充Local缓存外什么都不做。

文档中的这篇文章非常有说服力:

"这相当于调用ToList然后丢弃列表而没有实际创建列表的开销。"

我还认为你正在尝试将你的DbContext用作内存数据库,这不是它的设计目的。 EF中没有机制来清理DbContext或修剪其内容。正如你所发现的那样,分离确实有一些工作,但只有一部分工作......

DbContext的设计是短暂的。每次需要进行查询时都会创建一个新的,然后处理它。应该如何使用它。