实体框架在一次插入多行时忽略重复的主键值

时间:2013-12-22 22:39:34

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

我正在使用LINQ和Entity-Framework在SQL Server 2012数据库中插入一些数据。

我插入数据的数据库表有一个主键,我一次插入大约1000个记录。

这是我检索一组1000行的数据,并出于性能原因一次保存这1000行。

现在问题是我可能偶尔会获得这1000行中任何一行的重复值,当发生这种情况时,没有任何行保存在数据库中。

有没有什么方法可以静静地忽略那一行而不插入所有其他非重复的行?

我也尝试在每次插入之前查询数据库,但是性能成本太高了。

3 个答案:

答案 0 :(得分:0)

  

有没有什么方法可以静静地忽略那一行而不插入所有其他非重复的行?

如果可以在SQL Server中重新创建索引,则可以忽略重复项。插入之后重新创建没有ignore_dups的索引,因为没有。

它会更快
CREATE TABLE [dbo].[YourTable](
  [id] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
  [id] ASC
)WITH (IGNORE_DUP_KEY = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

答案 1 :(得分:0)

我建议你在插入语句之前做一些额外的处理,不需要任何代码,我会尝试用伪代码向你显示。

ICollection<record> myRecords = Service.GetMyRecords();
//your processing logic before the insert
ICollection<record> recordsToInsert =Service.BusinessLogic(myRecords);

foreach(var record in recordsToInsert)
{
    if(myRecords.Contains(record )
    {
        recordsToInsert.Remove(record);
    }
}

这应该确保您在recordToInsert集合中没有任何记录会使您的数据库绊倒。这也为您节省了一个尝试的插入语句,因为它不会尝试失败。

答案 2 :(得分:0)

首先检查一个查询是否存在任何新记录的查询:

var checks = records.Select(r => r.Id).ToArray();
if (!context.Records.Any(r => check.Contains(r.Id))
{
    // do the insert
}

在第一次检查后,您可以优化检查以找出1000条记录中的哪一条是罪魁祸首。所以快乐的场景总是非常快。只有当找到重复时,该过程才会变慢。

在运行一个事务时,您无法告诉EF静默忽略一个数据库异常。