实体框架中多对多关系的大规模添加和删除
本文关键字:添加 大规模 删除 关系 框架 实体 | 更新日期: 2023-09-27 18:04:52
我目前正在从事一个项目,该项目最近获得了许多数据库记录。我现在试着对它进行优化。以下是我的模型:
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个增量属于不同的来源。
用户可以在Queue中添加和删除'Sources';实际上,我只是添加或删除源到队列中的所有短语。这个结构不是我选择的,现在改变已经太晚了。
这些保存和删除现在导致我的测试系统崩溃,因为我似乎无法访问队列上的短语而不将它们拉入内存。即使尝试批量删除(例如context.Queues.Single(m => m.Id == queueId).Phrases.Take(1000);
或获得1000个短语存储为变量"短语"并执行context.Queues.Single(m => m.Id == queueId).Phrases.RemoveAll(m => phrases.Contains(m));
的IQueryable),似乎我正试图将该队列上的所有短语记录拉入内存。
是否有一种更简单的方法来删除这些记录之间的关系,同时仍然使用LINQ表达式?
以防其他人遇到同样的问题,我们决定不使用ORM来处理这种情况。我们只编写了两个SQL存储过程(一个用于添加,一个用于删除),这极大地简化了问题并提高了效率。当使用100,000多条记录进行测试时,如果不抛出内存不足异常,则需要花费大量的时间来完成操作。使用存储过程,我们的操作在几秒钟或更短的时间内完成。这种方法唯一的缺点来自于可测试性。