【问题标题】:Single Record vs Bulk Records Insert - Entity Framework单条记录与批量记录插入 - 实体框架
【发布时间】:2014-01-22 09:18:51
【问题描述】:

当我尝试填充上下文对象并一次保存/插入所有记录时,出现以下错误。

{"违反 PRIMARY KEY 约束 'PK_T8_2D83E3D3'。无法在对象 'dbo.T8' 中插入重复键。重复键值为 (AWLS0757043072)。\r\n语句有已终止。"}

var proxy = new AREntities();
foreach (var a in b)
{
    ..........
    proxy.AddtoXYZ(data); //Please note 'data' inside foreach loop is different at all times. I am not adding same record multiple times.
}
proxy.SaveChanges();

但是,如果我为每条记录创建上下文,然后将该记录插入/保存到数据库中,它就可以正常工作。见下文。

foreach (var a in b)
{
    ..........
    var proxy = new AREntities();
    proxy.AddtoXYZ(data);
    proxy.SaveChanges();
}

但是上面的代码显然搞砸了性能。我正在尝试诊断为什么在场景 1 中出现错误。有什么想法吗?

这里是key约束的定义。

ALTER TABLE [dbo].[T8] ADD PRIMARY KEY CLUSTERED 
(
    [C1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
GO

【问题讨论】:

  • 我看到 proxy.AddtoXYZ(data); ,检查数据对象 C1 属性值在 foreach 循环中是否重复
  • 这是我检查的第一件事,C1 始终不同。
  • 您是否尝试过重建 EntityFrameWork 数据模型?
  • 也这样做了。没有成功。

标签: c# sql sql-server entity-framework


【解决方案1】:

在第一个示例中,您多次添加相同的实体,并且主键值重复,因此出现错误。你这样做的第二种方式是正确的。仅在循环完成后调用 save changes,不会影响性能。

【讨论】:

  • foreach 循环内的数据始终不同。我没有多次添加相同的项目。
  • 在第一种情况下,您正在使用不同的数据修改同一个对象。只需将保存更改移出循环
  • 这就是我想要做的,这就是我得到错误的时候。
猜你喜欢
  • 1970-01-01
  • 2016-08-09
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2020-03-18
  • 2011-02-20
  • 1970-01-01
相关资源
最近更新 更多