我该如何做这两种情况。
目前我正在做这样的事情
public class Repository
{
private LinqtoSqlContext dbcontext = new LinqtoSqlContext();
public void Update()
{
// find record
// update record
// save record ( dbcontext.submitChanges()
}
public void Insert()
{
// make a database table object ( ie ProductTable t = new ProductTable() { productname
="something"}
// insert record ( dbcontext.ProductTable.insertOnSubmit())
// dbcontext.submitChanges();
}
}
所以现在我正在尝试加载一个包含大量记录的XML文件。首先,我一次验证一个记录。然后我想将它们插入到数据库中,而不是在每个记录之后执行submitChanges(),我想在最后进行批量提交。
所以我有类似的东西
public class Repository
{
private LinqtoSqlContext dbcontext = new LinqtoSqlContext();
public void Update()
{
// find record
// update record
}
public void Insert()
{
// make a database table object ( ie ProductTable t = new ProductTable() { productname
="something"}
// insert record ( dbcontext.ProductTable.insertOnSubmit())
}
public void SaveToDb()
{
dbcontext.submitChanges();
}
}
然后在我的服务层我会喜欢
for(int i = 0; i < 100; i++)
{
validate();
if(valid == true)
{
update();
insert()
}
}
SaveToDb();
因此假装我的for循环是对xml文件中找到的所有记录的计数。我首先验证它。如果有效,那么我必须在插入记录之前更新表。然后我插入记录。
之后我想一次性保存所有内容。
我不确定在更新时是否可以进行大规模保存,如果必须在每次或之后进行更新。
但我认为这对插入插件肯定有用。
似乎没有崩溃,我不知道如何检查记录是否被添加到dbcontext。
答案 0 :(得分:2)
简单的答案是:你没有。 Linq2Sql是很多东西 - 它不是批量上传/批量复制的替代品。使用ETL路线将会提高效率:
Linq2Sql将在设计中总是吮吸大量插入方案。 ORM不是ETL工具。
答案 1 :(得分:0)
Linq2SQL(如前所述)默认情况下处理不好,但幸运的是有一些解决方案。 here's当我想要进行一些批量删除时,我用于网站。它对我很有用,并且由于它使用扩展方法,它基本上与常规的Lin2SQL方法无法区分。
答案 2 :(得分:0)
即使在调用SubmitChanges之前向DataContext添加多个记录,LINQ2SQL也会循环并逐个插入它们。您可以通过在实体类上实现一个部分方法(“InsertMyObject(MyObject instance)”)来验证这一点。它将分别为每个挂起的行调用。
我认为您的计划没有任何问题 - 您说它有效,但您只是不知道如何验证它?你不能简单地在数据库中查看是否添加了记录吗?
另一种查看DataContext中尚未添加的记录的方法是在数据上下文中调用GetChangeSet(),然后引用返回对象的“Inserts”属性以获取行列表将在调用SubmitChanges时插入。
答案 3 :(得分:0)
我还没有真正“发布”这个项目,但它是一个基于T4的存储库系统,它扩展了Linq To SQL并实现了一堆批处理操作(删除,更新,创建csv等):{{3 }}。您可以查看源代码并按照您认为合适的方式实现它。
此外,此链接还有一些用于批处理操作的优秀源代码:http://code.google.com/p/grim-repo/
而且,我也知道这很诱人,但不要废话老人。尝试使用DataAdapters / ADO.net执行批处理操作:http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx。它更快,但不可避免地更加毛茸茸。
最后,如果您有XML文件,则可以创建一个利用SQL Server的内置sproc sp_xml_preparedocument的存储过程。在这里查看如何使用它:http://davidhayden.com/blog/dave/archive/2006/01/05/2665.aspx