在此代碼EF6:爲什麼Count返回0但Find返回一個元素?
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
叫其他職位。好的,所以這是「它的工作方式」。
我的問題是具體這個:爲什麼Find
返回一個對象從db.People
當Count()
返回0和枚舉器返回沒有元素? Find
和Count()
的行爲是否類似,在返回處於「已添加」狀態的實體之前是否等待SaveChanges
?
這是什麼原因?我問,因爲我正在編寫一個輕量級的非SQL提供程序,它需要儘可能地反映EF的操作。我找不出什麼邏輯導致Find
返回Count()
和GetEnumerator()
沒有的添加元素。我需要解決這些情況。
我完全理解這一點。我的問題是爲什麼,我還需要知道哪些地方的新增實體被搜索/包含,以及它們不在哪裏? – Veldaeven
每當您收到意想不到的結果時,我都會假設?例如,這也在[文檔](https://msdn.microsoft.com/en-us/library/gg696418(v = vs.113).aspx)中進行了解釋:「*如果具有給定主鍵的實體值存在於上下文中,然後立即返回,而不會向商店發出請求。*「 –
在閱讀關於'DbSet <>'上的每個方法的文檔之後,以及測試諸如使用'Queryable.FirstOrDefaulit'一個'DbSet',我認爲這就是答案 - Find方法是唯一一個明確聲明返回值來自上下文而不是數據庫的地方。 「保存更改」後,「FirstOrDefault」不會「查找」實體。 – Veldaeven