EF6:为什么Count返回0但是Find返回一个元素?

时间:2015-06-10 17:33:08

标签: entity-framework

在此代码中

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.PeopleCount()返回一个对象? FindCount()行为不应该相似,在返回处于“已添加”状态的实体之前等待SaveChanges吗?

这是什么原因?我问,因为我正在编写一个轻量级的非SQL提供程序,需要尽可能镜像EF的操作。我无法弄清楚是什么逻辑导致Find返回Count()GetEnumerator()没有的添加元素。我需要解决这些问题。

2 个答案:

答案 0 :(得分:1)

Find()具有特殊的质量:它将首先查看已添加但尚未刷新到数据库的DbContext实体(例如:具有EntityState.Added的实体)。< / p>

Count()并且枚举器会查看数据库,在您致电SaveChanges()之前,数据库显然还没有任何内容。

Background info

答案 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转到数据库。