C# 实体框架-确保不进行任何更新

C# 实体框架-确保不进行任何更新,c#,entity-framework,C#,Entity Framework,我正在使用WebAPI2(C#),并希望在控制器中使用以下代码(暂时忽略以下事实,即使用一些“ViewModel”等效分隔是最佳实践…) Playlist p = await _db.Playlists.FindAsync(id); p.Videos.ForEach(x => x.playlists = null); return Ok(p); 使用EF的播放列表和视频类通过导航属性具有多对多关系 Playlist p = await _db.Playlists.FindAsync(id

我正在使用WebAPI2(C#),并希望在控制器中使用以下代码(暂时忽略以下事实,即使用一些“ViewModel”等效分隔是最佳实践…)

Playlist p = await _db.Playlists.FindAsync(id);
p.Videos.ForEach(x => x.playlists = null);
return Ok(p);
使用EF的
播放列表
视频
类通过导航属性具有多对多关系

Playlist p = await _db.Playlists.FindAsync(id);
p.Videos.ForEach(x => x.playlists = null);
return Ok(p);
我是否可以100%确定,一旦我将播放列表设置为空(第2行),数据库将不会更新?(即不会使每个
Video.playlists
属性无效)

Playlist p = await _db.Playlists.FindAsync(id);
p.Videos.ForEach(x => x.playlists = null);
return Ok(p);
显然,我没有调用SaveChanges…但EF仍然跟踪我相信的对象…

您可以使用,但您不能使用
FindAsync

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

禁用延迟加载,不
包括播放列表:

Playlist p = await _db.Playlists.FindAsync(id);
p.Videos.ForEach(x => x.playlists = null);
return Ok(p);
_db.Configuration.LazyLoadingEnabled = false;
Playlist p = await _db.Playlists.FindAsync(id);
现在你甚至不必清除播放列表

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

但是请注意,将项目添加到播放列表中仍然不安全。他们可能会得救。因此,仍然建议在此基础上使用
AsNoTracking

如果禁用延迟加载,是否意味着无法访问视频(播放列表的导航属性)?谢谢您的补充回答。如果没有播放列表,如何访问他们的
视频
属性?无论如何,它不会改变对象结构中的任何内容,唯一的问题是没有加载播放列表,因此您可以用更少的步骤实现所需的内容。首先加载列表,然后清除它们是没有意义的。不确定你是否指其他内容……但是播放列表存在,我只是不能按原样返回对象(视频,视频反过来引用播放列表),因为序列化为JSON时会导致递归循环。因此,我们希望将Video.playlists暂时设置为空。您应该说它是在序列化的上下文中。对于序列化,应始终禁用延迟加载和跟踪。序列化程序将无限地遍历这些循环引用,因为(使用跟踪)EF通过关系修复填充它们。
Playlist p = await _db.Playlists.FindAsync(id);
p.Videos.ForEach(x => x.playlists = null);
return Ok(p);