Entity Framework 中的大规模增删多对多关系

Large Scale Additions and Deletions Many-to-Many Relationship in Entity Framework

我目前正在进行一个项目,该项目最近获取了许多数据库记录。我现在正在尝试为此进行优化。这是我的模型:

public class QueueEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<PhraseEntity> Phrases { get; set; }
}

public class PhraseEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual SourceEntity Source { get; set; }
    public virtual List<QueueEntity> Queues { get; set; }
}

public class SourceEntity 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<PhraseEntity> Phrases { get; set; }
}

我现在正在测试大约 100,000 个短语记录,并假设这些短语的每 20,000 个增量属于不同的来源。

用户可以从队列中添加和删除 'Sources';本质上,我只是将源中的所有短语添加或删除到队列中。这个结构不是我选择的,现在改也来不及了。

这些保存和删除现在导致我的测试系统崩溃,因为我似乎无法在不将它们拉入内存的情况下访问队列中的短语。即使在尝试批量删除时(例如 context.Queues.Single(m => m.Id == queueId).Phrases.Take(1000); 或获取存储为变量 'phrases' 的 1000 个短语的 IQueryable 并执行 context.Queues.Single(m => m.Id == queueId).Phrases.RemoveAll(m => phrases.Contains(m));),我似乎也在尝试提取该队列中的所有短语记录进入记忆。

有没有更简单的方法来删除这些记录之间的关系,同时仍然使用 LINQ 表达式?

如果其他人遇到同样的问题,我们决定不在这种情况下使用 ORM。我们只是写了两个 SQL 个存储过程(一个用于添加,一个用于删除),这极大地简化了问题并提高了效率。当测试超过 100,000 条记录时,如果不抛出内存不足异常,完成操作将花费大量时间。使用存储过程,我们的操作可以在几秒钟或更短的时间内完成。这种方法的唯一缺点来自可测试性的观点。