显式加载 DBSet 时,为什么不先删除现有元素?



EF新功能。试图找出"填充"数据集的数据表和"加载"DBSet之间的差异。

如果我填充一个DataSet的DataTable,在"fill"之前存在的记录将被删除。这允许我在DataTable中只需要记录。我也可以选择在"填充"之前不删除记录。但是我可以控制数据表中的内容。

当我显式地"加载"一个DBSet时,它不会删除任何已经在其中的实体,只是在上面添加。因此,与DataTable不同,DBSet似乎是增量填充的。如果我"Clear()" DBSet。本地,本地。Count变为0,但是被清除的实体仍然在某处加载(当我使用IsLoaded进行测试时)。而且,我似乎无法用另一个"load"将它们重新加载到。local中,因为它们已经加载了。

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

找到有用的东西:

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

这似乎从内存中删除实体(和。local)没有标记它从数据库中删除当你SaveChanges();

你的问题令人困惑。DbSet和DataTable不是一回事,你不能比较它们或它们的功能。"加载"DbSet到底是什么意思?三是DbSet中没有Load方法,尽管有一个Load Extension方法,它只会用查询对象填充本地缓存。

文档中的这段文字很能说明问题:

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

我也认为你试图使用你的DbContext作为一个内存中的数据库,这不是它的设计目的。在EF中没有清除DbContext或删减其内容的机制。正如你所发现的那样,分离确实有一些作用,但只是其中的一部分……

DbContext被设计为短期的。每次需要进行查询时创建一个新对象,然后处理它。就应该这么用的。

最新更新