LINQ to SQL从XML文件数据库附加对象集合

时间:2012-03-07 07:22:32

标签: c# .net linq linq-to-sql

我正在开发一个HRM应用程序来从数据库导入和导出xml数据。应用程序接收员工条目的导出xml数据。我使用linq将xml文件导入xml,在那里我将xml转换为相应的对象。然后我想附加(更新)员工对象。

我尝试使用

//linqoper class for importing xml data and converts into IEnumerable employees object.
  var emp = linqoper.importxml(filename.xml);
  Using (EmployeedataContext  db = new EmployeedatContext){
  db.attachAllonSubmit(emp);
  db.submitchange();
 }

但是我收到了错误 “An entity can only be attached as modified without original state if it declares as version member or doesn't have an update check policy”

我还可以选择检索每个员工,并使用此格式从xml数据中为新员工分配值。

//import IEnumerable of Employee objects
var employees = = linqoper.importxml(filename.xml)
using(Employeedatacontext db = new Employeedatacontext){
foreach(var empobj  in employees)
{
 Employee emp = db.Employee.where(m=>m.id==empobj.Id);
emp.FirstName=empobj.FirstName;
emp.BirthDate=empobj.BirthDate;
//….continue 
}
db.submitChanges();
}

但是上面的问题是我必须遍历整个员工对象,这非常无聊。 那么还有其他方法,我可以使用LINQ to SQL在数据库中附加(更新)员工实体。

我在SO上看到了一些类似的链接,但它们似乎都没有帮助。

https://stackoverflow.com/questions/898267/linq-to-sql-attach-refresh-entity-object

2 个答案:

答案 0 :(得分:1)

当linq-to-sql将更改保存到数据库时,它必须知道对象的属性已更改。它还检查在更新期间是否已完成对数据库的潜在冲突更新(乐观并发)。

要处理这些情况,LINQ-to-SQL在附加时需要两个对象副本。一个具有原始值(如DB中所示),另一个具有新的更改值。还有一种更高级的机制,涉及映射到rowversion列的版本成员。

更新一组数据的linq-to-sql方法是首先从数据库中读取所有数据,然后更新从数据库中检索的对象,最后调用SubmitChanges()。这将是我在你的情况下的第一个方法。

如果遇到性能问题,那么就该离开linq-to-sql的工具箱了。具有更好性能的解决方案是将新数据加载到单独的临时表中(为获得最佳性能,请使用批量插入)。然后运行执行数据实际合并的SQL命令或存储过程。 SQL Merge子句非常适合这种更新。

答案 1 :(得分:0)

LINQ to SQL是正确的ORM,但是如果你想控制你手中的创建/更新/删除;你可以尝试一些简单的ORM来提供CRUD操作的方法。我可以推荐一个http://crystalmapper.codeplex.com,它简单但功能强大。

为什么选择CrystalMapper?

我为大型金融交易系统构建了这个系统,其中包含大量的插入和更新操作。我需要的是速度和控制插入/更新服务复杂的业务场景......只针对一个事务点击多个表。

当我把它用于社交文本处理平台时,它也很好用。