【问题标题】:ObjectContext.SaveChanges and Duplicate PRIMARY KeyObjectContext.SaveChanges 和重复主键
【发布时间】:2011-03-06 16:00:41
【问题描述】:

我有一个用 php 编写的宠物项目。我的代码所做的一项工作是加载一堆 csv 文件并将它们写入具有自动生成的主键和多部分唯一键的 MySQL 表。我无法控制,并且可以检查某些文件是否已处理,因此唯一密钥很方便。我使用INSERT IGNORE 将数据插入到表中,当我尝试插入已经存在的数据并且一切正常运行时,它会静默失败。

现在,我正在尝试使用 LINQ To Entities 在 C# 4 中创建类似的项目,但是当我尝试从已经在表中的文件中调用 ObjectContext.SaveChanges() 方法时,UpdateException 被抛出,SqlClient.SqlException 作为内部例外。一种解决方案是将Ignore Duplicate Keys = Yes 添加到索引中,它有点工作,但是

  • 这是在服务器上而不是在客户端上更改
  • 使用现有索引更新时引发 OptimisticConcurrencyException

有没有简单优雅的方法来完成那些不涉及数据库更改的 L2E 插入???

【问题讨论】:

  • 我建议在保存更改之前检查关键字段的唯一性。

标签: c# entity-framework c#-4.0 linq-to-entities


【解决方案1】:

另一种解决方案是这样的:

public void SaveAll( IEnumerable<Entity> entities )
{
    var ids = entities.Select(x => x.Id).ToList();
    var idsToRemove = context.Entities.Where(x => ids.Contains(x.Id)).Select(x => x.Id).ToList();
    var entitiesToInsert = entities.Where(x => !idsToRemove.Contains(x.Id));

    foreach(var entity in entitiesToInsert)
        context.Entities.AddObject(entity);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多