【问题标题】:LINQ to SQL Attaching collection of object from XML file DatabaseLINQ to SQL 附加来自 XML 文件数据库的对象集合
【发布时间】:2012-03-07 07:22:31
【问题描述】:

我正在开发一个 HRM 应用程序来从数据库导入和导出 xml 数据。应用程序接收员工条目的导出 xml 数据。我使用 linq to 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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢@Anders-Abel,所以你的意思是没有办法使用 LINQ to SQL 中的 attach 方法附加从 XML 文件中提取的对象集合。
    【解决方案2】:

    LINQ to SQL 是正确的 ORM,但是如果您想控制自己的创建/更新/删除;你可以尝试一些简单的 ORM,它们只是提供了进行 CRUD 操作的方法。我可以推荐一个http://crystalmapper.codeplex.com,它简单而强大。

    为什么选择 CrystalMapper?

    我为具有大量插入和更新操作的大型金融交易系统构建了这个。我需要的是服务于复杂业务场景的插入/更新的速度和控制......只为一个事务处理多个表。

    当我将它用于社交文本处理平台时,它也能很好地发挥作用。

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多