實體框架允許獲得從數據庫對象,而不將它們添加到變更跟蹤:
using (var db = new MyContext())
{
var states = db.States.AsNoTracking();
...
}
但是,當你在一個參考使用State
對象,例如像:
var address = new Address() { State = state1 };
db.Addresses.Add(address);
db.SaveChanges();
其中state1
是State
對象,state1
將終究被附加到上下文,並有EntityState.Added
!
所以你應該小心如何使用這些「未跟蹤」的對象。在這個例子中,你最好設定一個原始StateId
屬性:
var address = new Address() { StateId = state1.Id };
(不重視state1
)。
在這種情況下,您真正想要的是防止EF永遠更改對象的EntityState
。我無法想到執行此操作。將是一個有趣的功能。
什麼手段這樣
的virtual
改性劑通常用於使導航屬性的遲緩裝載在碼「虛擬」。Address
可能有
public virtual State State { get; set; }
現在,當你抓住從數據庫中的地址,以後訪問其State
屬性,狀態從在那一刻數據庫加載。這是因爲在EF的基礎上,EF創建了一個Address
對象,該對象是Address
類的派生對象,它已使用啓用延遲加載的代碼覆蓋State
屬性。
但是,在顯示的代碼中,virtual
對延遲加載沒有影響,因爲它是一個字符串屬性。所以它不能是一個導航屬性,它不允許延遲加載。
謝謝!你能否在EF中向我展示更多關於'virtual'的文章?這個話題對我來說還不清楚。特別是「懶加載」 - 我不明白這一點。一些例子將對我非常有用:)關心! – whoah
這個怎麼樣:http://msdn.microsoft.com/en-us/data/jj574232.aspx? –
嗯一點點更容易理解,但仍不清楚。 EF如何知道'Eagerly Loading'哪些'Posts'必須加載到'Include'中?在「懶加載」中的同一個問題 - 據我所知,當我從數據庫中獲得例如'Blog'時,我也會自動獲得與這個博客相關的'Posts' - 我是對嗎?但是怎麼可能呢? EF如何知道哪些'Posts'與'virtual ICollection連接文章' –
whoah