从分离状态中删除关系

时间:2012-02-27 23:02:05

标签: c# entity-framework-4

我一直试图在下午的大部分时间里找到一个很好的解决方案,但无济于事。

当我使用实体框架(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);
    }

是否有人建议从分离状态删除对象?

1 个答案:

答案 0 :(得分:1)

问题是,一旦调用attach,就会附加整个对象图。给定一个名为DbContext的{​​{1}},一个应该起作用的例子如下:

context

这假定// 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,该附件只能附加一次。