我可以删除单个子实体而不加载整个集合吗?

2024-05-24

我有 2 个课程,如下所示。

它们可以拥有非常大的集合 - 一个网站可能有 2,000 多个网站页面,反之亦然。

  class WebsitePage 
  {
    public int ID {get;set;}
    public string Title {get;set;}
    public List<Website> Websites {get;set;}
  }

  class Website 
  {
    public int ID {get;set;}
    public string Title {get;set;}
    public List<WebsitePage> WebsitePages {get;set;}
  }

我在从网站中删除网站页面时遇到问题。特别是从多个网站中删除网站页面时。

例如,我可能有这样的代码:

var pageToRemove = db.WebsitePages.FirstOrDefault();
var websites = db.Websites.Include(i => i.WebsitePages).ToList();
foreach(var website in websites)
{
    website.WebsitePages.Remove(pageToRemove)
}

如果每个网站Include()2k 页,您可以想象加载第二行需要很长时间。

但如果我不这样做Include()获取网站时的 WebsitePages,没有加载可供我删除的子集合。

我试过只是Include()我需要删除的页面,但是当然在保存时会给我一个空集合。

有推荐的或更好的方法来解决这个问题吗?

我正在使用现有的 MVC 站点,但我不想这样做为连接表创建实体类 https://stackoverflow.com/questions/24561691/is-there-a-way-to-delete-a-child-entity-in-a-onetomany-relationship-with-a-joi除非绝对必要。


不,你不能……正常情况下。

多对多关系(具有隐藏的联结表)只能通过在嵌套集合中添加/删除项目来影响。为此,必须加载集合。

但还有一些选择。

选项1。

通过原始 SQL 从联结表中删除数据。基本上这看起来像

context.Database.ExecuteSqlCommand(
    "DELETE FROM WebsiteWebsitePage WHERE WebsiteID = x AND WebsitePageID = y"));

(不使用参数)。

选项 2。

将联结包含到类模型中,即将联结表映射到类WebsiteWebsitePage. Both Website and WebsitePage现在将有

public ICollection<WebsiteWebsitePage> WebsiteWebsitePages { get; set; }

and WebsiteWebsitePage将具有两者的参考属性Website and WebsitePage。现在您可以直接通过类模型操作连接点。

我认为这是最好的选择,因为一切都以与具有验证和跟踪等功能的实体合作的标准方式发生。此外,您迟早可能需要一个显式联结类,因为您需要向其中添加更多数据。

选项 3。

技巧之盒。

我尝试通过删除来做到这一点存根实体从集合中。在你的情况下:创建一个WebsitePage具有有效主键值的对象并将其从中删除Website.WebsitePages无需加载集合。但 EF 没有注意到更改,因为它没有跟踪Website.WebsitePages,并且该项目一开始就不在集合中。

但这让我意识到我必须让 EF 轨道成为Website.WebsitePages包含 1 个项目的集合,然后删除该项目。我首先构建了这个工作Website项目,然后将其附加到新的上下文。我将展示我使用的代码(标准Product - Category模型)以防止拼写错误。

Product prd;

// Step 1: build an object with 1 item in its collection
Category cat = new Category { Id = 3 }; // Stub entity
using(var db = new ProdCatContext())
{
    db.Configuration.LazyLoadingEnabled = false;
    prd = db.Products.First();
    prd.Categories.Add(cat);
}

// Step 2: attach to a new context and remove the category.
using(var db = new ProdCatContext())
{
    db.Configuration.LazyLoadingEnabled = false;
    db.Products.Attach(prd);

    prd.Categories.Remove(cat);

    db.SaveChanges(); // Deletes the junction record.
}

延迟加载已禁用,否则类别仍会在以下情况下加载prd.Categories已解决。

我对这里发生的情况的解释是:在第二步中,EF 不仅在您附加产品时开始跟踪产品,而且还开始跟踪它的关联,因为它“知道”您无法自己以多对多关系加载这些关联。但是,当您在第一步中添加类别时,它不会执行此操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以删除单个子实体而不加载整个集合吗? 的相关文章

随机推荐

  • Android 全屏对话框片段(如日历应用程序)

    我正在尝试实现如下图所示的全屏对话框 我能够显示全屏对话框 但是当显示对话框时 状态栏颜色变为黑色并且不保留原色深色 这是我的对话片段 public class IconsDialogFragment extends DialogFragm
  • 可空类型:在 C# 中检查 null 或零的更好方法

    我正在开展一个项目 我发现我正在很多很多地方检查以下内容 if item Rate 0 item Rate null 更多的是出于好奇 检查这两种情况的最佳方法是什么 我添加了一个辅助方法 public static bool nz obj
  • Javascript拆分正则表达式问题

    你好 我正在尝试我认为在 Javascript 中相当简单的正则表达式 但给我带来了很多麻烦 我希望能够通过 javascript 通过 和 分割日期 var date 02 25 2010 var myregexp2 new RegExp
  • 查找 python 数据框中每行的最高值

    我想找到每行中的最高值并返回 python 中该值的列标题 例如 我想找到每行的前两个 df A B C D 5 9 8 2 4 1 2 3 我希望我的输出看起来像这样 df B C A D 您可以使用字典理解来生成largest n数据帧
  • 混合 SOM(带 MLP)

    有人可以提供一些有关如何正确地将自组织映射与多层感知器结合起来的信息吗 我最近读了一些关于这种技术的文章 与常规 MLP 相比 它在预测任务中表现得更好 因此 我想使用 SOM 作为前端 通过对输入数据进行聚类来降维 并将结果传递到 MLP
  • git Push Remote:警告:hooks.mailinglist 有多个值

    我刚刚从使用 gitosis 升级到 gitolite 电子邮件通知适用于所有存储库 但对于 gitolite admin 存储库 我在推送时收到此警告 推送很好 git push remote warning hooks announce
  • 使用 Google 应用引擎接收多文件帖子

    我想从图像上传器接收多文件帖子 我用这个 http www adylevy com index php 2009 07 22 multiple files uploader with preview on client side 大多数示例
  • 访问默认 lambda 参数中的模板类参数

    我正在写一个简单的通用池 模板类在构造函数中采用一个参数 该参数是一个工厂函数 用于根据需要实例化池中的对象 template
  • 从 json 数组中获取成对的值

    首先 这是我从 php 源获取的 json 值 oid 2 cid 107 oid 4 cid 98 oid 4 cid 99 之后 我想要得到并且oid值以及相应的cid值例如 oid 2 and cid 107一口气 oid 4 and
  • Laravel - 重复键批量插入更新大数据集

    我有大约 80k 条记录 每天需要多次运行插入 更新脚本 INSERT INTO my rankings id rank VALUES 1 100 2 99 3 102 80000 3 ON DUPLICATE KEY UPDATE ran
  • PowerShell Get-ChildItem 如何捕获异常

    我目前正在编写一个可视化错误 GUI 它可以在处理时捕获任何异常 并向用户提供 易于理解 的错误消息 但似乎我在使用时无法捕获任何异常Get ChildItemcmdlet 我是否必须使用与 try catch 不同的方法 这是 Power
  • 将“dplyr::across”与具有多个参数的函数一起使用

    我想知道是否有办法使用dplyr across一个需要多个参数的函数 如果没有 如何执行以下操作dplyr tidyverse library dplyr create a dataframe df lt structure list x1
  • 将平面数组拆分为分组子数组,其中包含输入数组中连续键的值

    我有一个数组array diff函数 如下所示 Array 0 gt world 1 gt is 2 gt a 3 gt wonderfull 5 gt in 6 gt our 正如您所看到的 键 3 和键 5 之间有一个间隙 即没有键 4
  • PowerBI区分空白值和0值

    有没有办法区分列中的空白值和列中的 0 值 当我使用 if 语句进行测试时 它们被视为相同的值 有什么建议吗 就在这里 在计算列中 首先测试值是否为空 然后测试是否为零 因此 创建一个标志并通过它过滤您的总和度量 即 No blanks s
  • 从 Excel 将参数传递到 SQL Server 上的 MS Query 中的临时变量

    我已经使用 Microsoft 查询创建了参数查询 如上所述here https superuser com questions 197453 run an sql query with a parameter from excel 200
  • WCF 缓存解决方案 - 需要建议

    我工作的公司正在寻求实施缓存解决方案 我们托管了多个 WCF Web 服务 并且需要缓存某些可以持久保存和获取的值 无论客户端与服务的会话如何 我正在研究以下技术 缓存应用程序块 4 1 使用 HttpRuntime 缓存的 WCF TCP
  • 基本矩阵错误?

    我试图通过扫描从相机拍摄的两个图像 检测图像中的特征 匹配它们 创建基本矩阵 使用相机内在函数计算基本矩阵 然后分解它以找到旋转和翻译 这是matlab代码 I1 rgb2gray imread 1 png I2 rgb2gray imre
  • 捕获数据包后会发生什么?

    我一直在阅读关于网卡捕获数据包后会发生什么的内容 我读得越多 我就越困惑 首先 我读过传统上 在网卡捕获数据包后 它会被复制到内核空间中的一个内存块 然后复制到用户空间 供随后处理数据包数据的任何应用程序使用 然后我读到了 DMA 其中 N
  • 不允许循环文件引用。发布 ASP.NET (2.0) 网站

    当我重新 构建 ASP NET 网站时 我没有收到任何错误 然而 当我发布该网站时 它给我一个 不允许循环文件引用 的信息 错误 我在网上读到了一些关于此的内容 它提供了一个batch false 选项 我尝试过但什么也没做 该页面有一个母
  • 我可以删除单个子实体而不加载整个集合吗?

    我有 2 个课程 如下所示 它们可以拥有非常大的集合 一个网站可能有 2 000 多个网站页面 反之亦然 class WebsitePage public int ID get set public string Title get set