单记录与批量记录插入 - 实体框架

时间:2014-01-22 00:34:05

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

当我尝试填充上下文对象并立即保存/插入所有记录时,我收到以下错误。

{“违反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();

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

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

但是上面的代码显然会破坏性能。我试图诊断为什么我在方案1中得到错误。有什么想法吗?

这是关键约束的定义。

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

1 个答案:

答案 0 :(得分:0)

在第一个示例中,您多次添加同一个实体,并且主键值重复,因此导致错误。你正在做的第二种方式是正确的。仅在循环完成后调用保存更改,不会对性能产生影响。