从分离状态中删除关系
本文关键字:删除 关系 状态 分离 | 更新日期: 2023-09-27 18:25:55
的大部分时间里,我一直在试图找出一个好的解决方案,但无济于事。
当我使用实体框架 (EF( 查询数据时,我始终使用 MergeOption.NoTracking
,因为我不想使用数据库对象在我的视图中显示。 我最终采用 EF 生成的 POCO 类,并将它们映射到具有可爱小属性(如必需、显示名称等(的视图模型中。 当我需要进行更新时,我最终会将视图模型映射回实体框架生成的类,并执行创建或更新操作。
我正在尝试找到一种简单的方法来删除与我的对象的关系,但由于它们是分离的,我一直无法找到一种方法来做到这一点。 我看到有人建议附加和删除对象,但由于我的对象已分离,因此不起作用(它会导致消息Attach is not a valid operation when the source object associated with this related end is in an added, deleted, or detached state. Objects loaded using the NoTracking merge option are always detached.
异常(。
这是我当前代码的示例:
//Find the records that need to be deleted.
var productVersionsToDelete = (from pv in existingDownloadFile.ProductVersions
where !selectedVersions.Contains(pv.Id)
select pv).ToList();
foreach (var productVersionToDelete in productVersionsToDelete) {
existingDownloadFile.ProductVersions.Attach(productVersionToDelete);
existingDownloadFile.ProductVersions.Remove(productVersionToDelete);
}
是否有人建议从分离状态删除对象?
问题是,一旦调用 attach ,整个对象图就会被附加。给定一个名为 context
的DbContext
,一个应该工作的例子如下:
// Attach the download file to the context set (this will attach all ProductVersions
context.DownloadFiles.Attach(existingDownloadFile);
//Find the records that need to be deleted.
var productVersionsToDelete = (from pv in existingDownloadFile.ProductVersions
where !selectedVersions.Contains(pv.Id)
select pv).ToList();
foreach (var productVersionToDelete in productVersionsToDelete)
existingDownloadFile.ProductVersions.Remove(productVersionToDelete);
context.SaveChanges();
这假定DownloadFiles
是DbContext
上公开与existingDownloadFile
类型匹配的实体的属性的名称。
您得到的异常是因为一旦您附加了ProductVersion
,它就会附加相关的existingDownloadFile
,该只能附加一次。