从分离状态中删除关系

本文关键字:删除 关系 状态 分离 | 更新日期: 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 ,整个对象图就会被附加。给定一个名为 contextDbContext,一个应该工作的例子如下:

// 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();

这假定DownloadFilesDbContext上公开与existingDownloadFile类型匹配的实体的属性的名称。

您得到的异常是因为一旦您附加了ProductVersion,它就会附加相关的existingDownloadFile,该只能附加一次。