EF Core,将大量大型实体添加到另一个实体的多对多关系的有效方法?

问题描述 投票:0回答:2

假设我有两个模型,标签和帖子,标签模型非常大(很多列)。一个标签可以有多个帖子,一个帖子可以有多个标签。

我知道如何设置标签和帖子之间关系的唯一方法是做

var veryLargeTagList = context.Tags.Where(some logic).ToArray();
myPost.Tags.AddRange(veryLargeTagList);

我的问题是,这似乎需要将大量标签加载到内存中,将这些标签添加到帖子中的最有效(最快/内存效率)方式是什么?有没有一种方法可以仅使用标签 ID 添加要发布的标签?像这样:

var veryLargeTagList = context.Tags.Where(some logic).Select(e=>e.Id).ToArray();
myPost.Tags.AddRange(veryLargeTagList);
c# entity-framework-core .net-7.0 asp.net-core-7.0
2个回答
0
投票

你可以使用两种方式

1。 你可以使用 tsql 批量插入

create proc insertPost
 @Text nvarchar(100)

as

insert into Posts
(Text,created,tageID)
select @Text,GETDATE(),Id
from Tags
where some logic

你可以使用批量插入

var bulkConfig = new BulkConfig()
{

   BatchSize = 1024

};
var subEntities = new List<PostTag>();
SchoolContext context = new SchoolContext();
string text = "";
int PostId = context.Post.FirstOrDefault(d => d.Text == text).ID;

subEntities = context.Tags.Where(some logic).Select(t => new PostTag { PostId = PostId, TagId = t.ID }).ToList();
await context.BulkInsertAsync(subEntities, bulkConfig);


BulkExtensions 库的链接:EFCore.BulkExtensions

BulkExtensions 学习链接:LearnBulkExtensions


0
投票

您尝试过使用联结表吗?那将是一种仅添加 ID 的方法。

您创建了一个只有 PostId 和 TagId 的联结表。然后你在那里添加关系。

像这样的东西:

© www.soinside.com 2019 - 2024. All rights reserved.