2012-02-03 44 views
8

在EF 4中,我可以通過在DbContext.Database.SqlQueryDbContext.Set<T>().SqlQuery上編寫sql來加載導航屬性嗎?我似乎沒有得到我的導航屬性填充。急於在EntityFramework中用DbContext.Database.SqlQuery加載

編輯

看來我可以做DbContext.Set()。SqlQuery類eagerloading,只是沒有DbContext.Database.SqlQuery。任何想法爲什麼?

+0

DbContext.Set()類SqlQuery不做預先加載;它延遲加載。你可以看到這一點,如果你輸出的sql執行和步驟通過代碼,使用:db.Database.Log = message => {Debug.WriteLine(message); }; – 2015-10-13 20:35:46

回答

4

DbSet.SqlQuery的工作方式與Database.SqlQuery不同。 DbSet上的方法適用於給定的實體集。它必須返回給定類型的實體,並且默認情況下將跟蹤返回的實體。 Database.SqlQuery可以返回任何對象(可能不是實體),並且返回的對象不會被上下文跟蹤。您可能還需要看看MSDN比較這兩種方法:

Database.SqlQuery - http://msdn.microsoft.com/en-us/library/gg679117(v=vs.103).aspx

DbSet.SqlQuery - http://msdn.microsoft.com/en-us/library/system.data.entity.dbset.sqlquery(v=VS.103).aspx

+0

感謝您的回覆。我已經瞭解跟蹤部分。我想知道爲什麼我的導航屬性不會被填充。當我加入具有1-M關係的表(原始sql)時,我希望我的導航屬性被預先加載。它與DbContext.Set ().SqlQuery但出於某種原因,它不與DbContext.Database.SqlQuery。 – enamrik 2012-02-04 12:07:07

+0

你可以在彈出導航屬性的地方顯示代碼嗎?這兩個方法最終調用ObjectContext.ExecuteStoreQuery,我不認爲它填充導航屬性(至少它沒有當我嘗試)。 – Pawel 2012-02-04 20:46:12

+0

請查看https://gist.github.com/0xorial/6363788 – ironic 2013-08-28 08:57:56