C# LINQ到实体-保存更改花费太多时间
目前,我正在努力解决一个关于实体框架(LINQ到实体)的问题。大多数时候,当我尝试执行entity.SaveChanges()时,一切正常,但有时entity.SaveChanges()会花费太多时间和超时。我找了很多,但找不到答案 (根据公司政策,我不能将代码复制到其他地方。因此,我没有确切的代码,但我会尝试布局基本结构。我希望这能帮助您解决问题,但如果我没有,请告诉我。) 任务: 我的任务是扫描整个网络中的一些特定文件。将每个文件的内容与数据库的内容相匹配,并根据匹配结果使用文件的内容插入或更新数据库。我在网络上有大约3000个文件 问题:C# LINQ到实体-保存更改花费太多时间,c#,linq,entity-framework,linq-to-entities,entity-framework-5,C#,Linq,Entity Framework,Linq To Entities,Entity Framework 5,目前,我正在努力解决一个关于实体框架(LINQ到实体)的问题。大多数时候,当我尝试执行entity.SaveChanges()时,一切正常,但有时entity.SaveChanges()会花费太多时间和超时。我找了很多,但找不到答案 (根据公司政策,我不能将代码复制到其他地方。因此,我没有确切的代码,但我会尝试布局基本结构。我希望这能帮助您解决问题,但如果我没有,请告诉我。) 任务: 我的任务是扫描整个网络中的一些特定文件。将每个文件的内容与数据库的内容相匹配,并根据匹配结果使用文件的内容插入或
public void PerformAction()
{
DbTransaction tran = null;
entity.Connection.Open(); //entity is a global variable declared like myDatabaseEntity entity = new myDatabaseEntity();
tran = entity.Connection.BeginTransaction();
foreach(string path in listOfPaths)
{
//returns 1 - Multiple matching in database OR
// 2 - One matching file in database OR
// 3 - No Matching found.
int returnValue = SearchDatabase();
if(returnValue == 1)
DoSomething(); //All inserts/updates work perfectly. Save changes also works correctly.
else if(returnValue == 2)
DoSomething(); //Again, everything ok. SaveChanges works perfectly here.
else
{
//This function uses some XML file to generate all the queries dynamically
//Forexample INSERT INTO TABLEA(1,2,3);
GenerateInsertQueriesFromXML();
ExecuteQueries();
SaveChanges(); <---- Problem here. Sometimes take too much time.
}
//Transaction commit/rollback code here
}
}
public bool ExecuteQueries()
{
int result = 0;
foreach(string query in listOfInsertQueries)
{
result = entity.ExecuteStoreCommand(query); //Execute the insert queries
if(result <=0)
return false;
}
entity.TestEntityA a = new entity.TestEntityA();
a.PropertyA = 123;
a.PropertyB = 345;
//I have around 25 properties here
entity.AddToTestEntityA(a);
return true;
}
public void performation()
{
DbTransaction tran=null;
entity.Connection.Open();//entity是一个声明为类似myDatabaseEntity entity=new myDatabaseEntity()的全局变量;
tran=entity.Connection.BeginTransaction();
foreach(路径列表中的字符串路径)
{
//返回1-数据库中的多个匹配项或
//2-数据库中的一个匹配文件或
//3-未找到匹配项。
int returnValue=SearchDatabase();
如果(返回值==1)
DoSomething();//所有插入/更新都能正常工作。保存更改也能正常工作。
else if(returnValue==2)
DoSomething();//同样,一切正常。保存更改在这里非常有效。
其他的
{
//此函数使用一些XML文件动态生成所有查询
//例如,插入表A(1,2,3);
GenerateInsertQueriesFromXML();
ExecuteQueries();
SaveChanges();找到了问题
我插入所有数据的主表在INSERT和DELETE上有一个触发器
因此,每当我在主表中插入一些新数据时,触发器都会在后端触发,并且会占用所有时间
实体框架是快速且无害的:D如果您试图同时插入大量数据,请尝试将其拆分为多个SaveChanges()
。但是,现在我们只能猜测您的问题是什么。您可能需要询问您的同事,他们可以查看您的代码。实际上,我在网络上为每个文件插入数据,然后关闭事务并为新文件启动一个新的事务。在每次迭代中,我只插入大约20次。事实上,EntityFramework并不是很流行批量插入的od。但是它看起来确实像你的DbContext
是一个成员字段。你应该知道DbContext
s应该尽快被处理掉,你不应该重复使用上下文。试着写一个存储过程……我也有同样的问题……最后我写了存储过程。@SanjooUthaiahBollera我不能立即转到存储过程。