2015-06-27 180 views
0

我正在使用WebAPI2(C#)並希望在控制器中使用以下代碼(現在忽略使用某些「ViewModel」等效分隔的最佳實踐......)實體框架 - 確保沒有更新

Playlist p = await _db.Playlists.FindAsync(id); 
p.Videos.ForEach(x => x.playlists = null); 
return Ok(p); 

Playlist的和Video類,使用EF,具有經由導航性能的多到多的關係。

我可以100%確定,一旦我將播放列表設置爲空(第2行),數據庫將不會被更新? (即不會廢掉每個Video.playlists屬性)

很顯然,我不是要求的SaveChanges ...但還是EF跟蹤我相信,對象...

回答

1

您可以使用AsNoTracking() extension,但你不能使用FindAsync接着就,隨即。

Playlist p = await _db.Playlists.AsNoTracking().SingleOrDefault(p => p.Id == id); 
p.Videos.ForEach(x => x.playlists = null); 
return Ok(p); 
1

禁用延遲加載和不Include播放列表:

_db.Configuration.LazyLoadingEnabled = false; 
Playlist p = await _db.Playlists.FindAsync(id); 

現在,你甚至不必清除播放列表。

但請注意,將項目添加到播放列表仍然不安全。不知何故,他們可能會得救。因此,建議在此基礎上使用AsNoTracking

+0

如果延遲加載被禁用,是否意味着視頻(播放列表的導航屬性)將不可訪問?感謝您的額外答覆。 – ASX

+0

如果沒有播放列表,他們的'Videos'屬性如何訪問?無論如何,它不會改變對象結構中的任何內容,唯一的問題是播放列表不會被加載,所以您只需要更少的步驟即可實現所需內容。首先加載列表然後清除它們毫無意義。 –

+0

不知道你的意思是別的什麼......但播放列表存在,我只是不能按原樣返回對象(使用視頻,然後引用播放列表),因爲它會在序列化爲JSON時導致遞歸循環。因此希望將Video.playlists設置爲null。 – ASX