2011-03-06 155 views
3

我有一个用php写的我的宠物项目。我的代码所做的一件工作是加载一堆csv文件,并将它们写入到具有自动生成的主键和多部分唯一键的MySQL表中。我没有任何控制权和检查方式是已经处理了一些文件,所以独特的密钥来得方便。我将数据插入INSERT IGNORE表中,当我尝试插入已存在的数据并且所有工作都很好时,它会静默失败。ObjectContext.SaveChanges和重复的主键

现在,我试图在C#4类似的项目中使用LINQ到实体,但是当我尝试调用的对象ObjectContext.SaveChanges()方法从已经在表文件,UpdateException抛出与SqlClient.SqlException作为内部异常。一个解决方案是将Ignore Duplicate Keys = Yes索引,它还挺作品,但

  • 在变更服务器上,而不是在客户端
  • OptimisticConcurrencyException被套上更新与现有指数

有轻松优雅的方式来用L2E完成那些不涉及数据库更改的插入?

+0

我建议保存更改之前,你检查的唯一性的关键领域。 – RBZ 2011-10-07 18:32:09

回答

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); 
}