LINQ Add/AddRange 覆盖最后一行

LINQ Add/AddRange are overriding last row

我正在尝试使用 'Add' 或 'AddRange' 方法将列表添加到 table,但它们继续覆盖最后一行,最后我只有一行数据库。

查询服务代码:

private async Task AddProductTags(Product product, List<Process> processes)
    {
        foreach(var process in processes)
        {
            var tags = await _context.Tag.Where(tag => tag.ProcessId == process.ProcessId).ToListAsync();
            List<ProductTag> productTags = new List<ProductTag>();

            foreach(var tag in tags)
            {
                //ProductTag productTag = new ProductTag();
                //productTag.ProductId = product.ProductId;
                //productTag.Product = product;
                //productTag.TagId = tag.TagId;
                //productTag.Tag = tag;
                //productTag.Value = "0";

                //productTags.Add(productTag);

                _context.ProductTag.Add(new ProductTag()
                {
                    ProductId = product.ProductId,
                    Product = product,
                    TagId = tag.TagId,
                    Tag = tag,
                    Value = "0"
                });
                await _context.SaveChangesAsync();
            };

            //_context.ProductTag.AddRange(productTags);
            //await _context.SaveChangesAsync();
        }

    }

如您所见,我一直在尝试不同的方法。我一直在阅读将对象初始值设定项放入循环中的解决方案的帖子,但我从一开始就这样做了。如果我调试并在循环中停止,我已经检查插入第一行是否正常(使用 'Add' 方法),但随后用下一行覆盖它。

我敢打赌这是一件愚蠢的事情,因为我仍在学习 EF Core,但我找不到错误。

已更新

产品标签 class:

public class ProductTag
{
    public int ProductId { get; set; }
    public int TagId { get; set; }

    public virtual Tag Tag { get; set; }

    public virtual Product Product { get; set; }

    public string Value { get; set; }
}

数据库table配置:

public ProductTagConfiguration(EntityTypeBuilder<ProductTag> entityTypeBuilder)
    {
        entityTypeBuilder.HasKey(pt => new { pt.ProductId, pt.TagId });
        entityTypeBuilder.Property(pt => pt.Value).IsRequired();

        entityTypeBuilder
            .HasOne(pt => pt.Product)
            .WithOne(p => p.ProductTag); 

        entityTypeBuilder
            .HasOne(pt => pt.Tag)
            .WithOne(t => t.ProductTag); 
    }

假设 ProductTag 的 PK 等于 ProductId,您正在为每个进程更新相同的产品更改标签。如果需要复制不同tag的产品,每次都需要生成新的ProductId。否则,您需要对所有标签求和,最后将 ProductTag 添加到 collection

问题是数据库设置中的错误配置:

public ProductTagConfiguration(EntityTypeBuilder<ProductTag> entityTypeBuilder)
{
    entityTypeBuilder.HasKey(pt => new { pt.ProductId, pt.TagId });
    entityTypeBuilder.Property(pt => pt.Value).IsRequired();

    entityTypeBuilder
        .HasOne(pt => pt.Product)
        .WithOne(p => p.ProductTag); // HERE IT'S THE MISTAKE

    entityTypeBuilder
        .HasOne(pt => pt.Tag)
        .WithOne(t => t.ProductTag); // AND HERE TOO
}

当我看到数据库配置时,我意识到错在哪里。我将它设置为 1..1 关系,这是因为同一行正在更新。问题已解决,感谢大家。