.net core 如何使用自动生成的id在同一事务中添加多个实体?

.net core 如何使用自动生成的id在同一事务中添加多个实体?,.net-core,entity-framework-core,.net Core,Entity Framework Core,我有一个循环 theTag = new ReportAdminTag() { Text = tag.Text }; _context.ReportAdminTag.Add(theTag); _context.Entry(theTag).State = EntityState.Detached; _context.SaveChanges(); 但是第二次通过它会抛出一个错误 无法跟踪实体类型“ReportAdminTag”的实例,因为 另一个具有{'Id'}相同键值的实例已在运行 追踪 ID都是

我有一个循环

theTag = new ReportAdminTag() { Text = tag.Text };
_context.ReportAdminTag.Add(theTag);
_context.Entry(theTag).State = EntityState.Detached;
_context.SaveChanges();
但是第二次通过它会抛出一个错误

无法跟踪实体类型“ReportAdminTag”的实例,因为 另一个具有{'Id'}相同键值的实例已在运行 追踪


ID都是默认的Guid,因为我正在使用mssql newid()生成ID。

听起来EF实现有问题,与EF Core的InMemory提供程序相关

但是,它也可能在SQL Server上发生(重复),与NewID()或NewSequentialID()函数的结果值关联

因此,在添加包含guid列的新实体时,如果您创建任何guid帮助器来帮助EF,似乎将更加安全

我建议将Guid.NewId()值与任意随机值结合起来,生成32字节的base85编码(varchar(32)*)


*)将guid列类型设置为varchar(32)。

我重新运行Scaffold DbContext从数据库生成代码,一切都开始工作。我可能做了一些小的改变,没有导致错误,反而导致了这种奇怪的行为


这里的教训是不要带着未完成的工作去度假。

在处理
Guid
类型时,我发现让客户端生成Id(
Guid.NewGuid()
)而不是服务器更容易。它的好处是不需要往返来获取生成的Id。使用gb网络控制器,许多小于1 kb的并发往返对性能没有显著影响。切勿在循环中调用
SaveChanges
,这会降低性能。谢谢我在那里做的b/c我不知道为什么它不工作,我想这可能会有帮助。事实证明,我只需要重新生成代码,因为某些内容没有与我的模式同步。