2013-07-23 50 views
0

我使用DbContext。
爲依賴實體懸掛外鍵

看看這些代碼兩個變種:

var context = new MyEntities(); 
context.Configuration.LazyLoadingEnabled = false; 

var item = context.Items.OrderBy(i => i.Id).First(); 
var oCtx = (context as IObjectContextAdapter).ObjectContext; 
var relationshipManager = oCtxc.ObjectStateManager.GetRelationshipManager(item); 

這一個:

var context = new MyEntities(); 
context.Configuration.LazyLoadingEnabled = false; 

var item = context.Items.OrderBy(i => i.Id).First(); 
context.Entry(item);  
var oCtx = (context as IObjectContextAdapter).ObjectContext; 
var relationshipManager = oCtxc.ObjectStateManager.GetRelationshipManager(item); 

唯一的區別是呼叫context.Entry(item);

我有differen結果。
在第一種情況下relationshipManager.Relationships.Count等於1
在第二個 - 5

項目有一個外鍵屬性和RelationshipManager爲它創建懸掛鍵。沒關係。

不應該ObjectContext查詢具有關係'一對多關係'的項目的從屬實體的關鍵字嗎?

這絕對是DbContext.Entry()在幕後做的,但我認爲這是由ObjectContext實現的。

回答

0

它看起來像ObjectContext查詢依賴項的鍵,但最初對空值沒有任何作用(不依賴項 - EntityReference.EntityKey = null)。
啓用ProxyGeneration後,任何導航屬性訪問都會觸發爲這些空值生成懸掛鍵。
如果沒有代理,則調用DbContext.Entry()時會添加空值的新關係。

我不知道它是DbContext的功能還是ObjectContext具有相同的行爲。需要檢查...