1

是否有什麼特別的原因爲什麼添加一個項目到EF4.1集合,將其保存到數據庫,然後再次選擇該集合會產生奇怪的結果?EF4.1,POCOS,動態代理和集合

當我做初始加載,集合中的所有項目都是一個類型System.Data.Entity.DynamicProxies.MyClassName_LongString的,所以對收集以下選擇工作:

var y = MyCollection.Where(x => x.ValidTo == null).First(); 

是的,總有集合中的一個項目,其符合該標準。總是。

但是,如果我選擇集合,向它添加一個新項目,保存更改,然後在同一個上下文中再次選擇集合,集合中的最後一個項目(新集合)不是動態代理,而是我的POCO類型(Moo.Model.MyClassName)。

開始執行相同的選擇集合的版本會拋出一個空引用異常 - 即使最後一個項目(非動態代理的一個)的確符合我通過觀察確認的條件手動收集...

在更改之後從另一個上下文加載集合,並且行爲不會自行顯示 - 它們都是動態代理,並且選擇工作正常。

有沒有人有什麼想法造成這種行爲是什麼?

回答

1

但是,如果我選擇集合,添加一個新的項目,然後,保存 更改,然後在同樣的情況下再次選擇集合,集合中的 最後一個項目(新一),是不是動態代理,而是 而不是我的POCO類型(Moo.Model.MyClassName)。

如果使用new運算符創建新項目,則它不是代理。並且,當您使用相同的上下文查詢它時,它不會成爲代理,因爲實體框架將檢查是否已經有一個對象具有與該對象上下文相同的鍵,如果是,則不會創建新的(代理)對象。所以,你的新實體仍然是不是代理的同一個對象。

如果以這種方式工作,你應該實際創建實體擺在首位的代理,這意味着你不使用new運營商,而是方法的CreateDbSet<T>

var newEntity = dbContext.Entities.Create(); 

現在,newEntity是一個代理服務器,與您的收藏中已有的其他實體一樣。

我不知道爲什麼你會得到你描述的異常(這可能與代理和非代理對象在同一個集合中混合使用),但希望當你使用Create方法時它會消失而不是new

+0

出於某種原因,使用.Create方法代替新工作,但像你一樣,我不知道它爲什麼。乾杯。 – Moo