在此代码中
using (var db = new DbPerson())
{
var b = db.People.Create();
b.Name = "Homer";
db.People.Add( b );
Console.WriteLine( "Count: {0}", db.People.Count() );
foreach (var bb in db.People)
Console.WriteLine( bb.Name );
var fb = db.People.Find( b.Id ); // Id is a GUID generated in the Person ctor
// NOT a DB-generated Identity.
Console.WriteLine( "Found: {0}", fb != null );
db.SaveChanges();
Console.WriteLine( "Count: {0}", db.People.Count() );
}
输出如下:
Count: 0
Found: True
Count: 1
在调用SaveChanges
之前,我看过其他有关Count未更新的帖子。好的,这就是“它的工作方式”。
我的问题具体是这样的:当Find
返回0并且枚举器没有返回任何元素时,为什么db.People
从Count()
返回一个对象? Find
和Count()
行为不应该相似,在返回处于“已添加”状态的实体之前等待SaveChanges
吗?
这是什么原因?我问,因为我正在编写一个轻量级的非SQL提供程序,需要尽可能镜像EF的操作。我无法弄清楚是什么逻辑导致Find
返回Count()
和GetEnumerator()
没有的添加元素。我需要解决这些问题。
答案 0 :(得分:1)
Find()
具有特殊的质量:它将首先查看已添加但尚未刷新到数据库的DbContext实体(例如:具有EntityState.Added
的实体)。< / p>
Count()
并且枚举器会查看数据库,在您致电SaveChanges()
之前,数据库显然还没有任何内容。
答案 1 :(得分:1)
如果你问为什么它是这样实现的:Find
应该允许你通过ID访问不在数据库中的跟踪实体。 Find
是一种非常特殊的用途。也许它允许检索已删除的实体,文档也没有说。 There are other APIs for reaching into the pool of tracked entities as well.
通常情况下,如果你需要弄乱EF,那就是使用EF(或者是黑客的标志)的一个标志。
NHibernate有一个非常有用的Find
:它允许你获得一个没有的实体进入数据库。它返回一个代理。这样你总是可以传递实体对象,几乎不会传递ID。一个很好的抽象。 EF无法实现这一点。 Find
转到数据库。