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 关系,这是因为同一行正在更新。问题已解决,感谢大家。
我正在尝试使用 '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 关系,这是因为同一行正在更新。问题已解决,感谢大家。