Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6,创建新实体的速度非常慢_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体框架6,创建新实体的速度非常慢

C# 实体框架6,创建新实体的速度非常慢,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我有一个方法,可以从我的数据库中读取文本文件,解析它并创建(或更新)实体。 代码很简单: 1-读取/解析文件并创建列表 2-在这个列表中循环,首先查看是否找到了产品,如果没有,它将创建它。 3-更新属性 4-将上下文保存到循环外部 问题是,在循环的每次迭代中,创建部分(if中的部分)花费的时间越来越长 我的问题是: 这是向上下文添加实体的最佳方法吗? 这能有所改善吗 我对实体框架非常陌生,不确定是否正确使用了它。 顺便说一句,上下文是在调用方法中创建的 谢谢你的建议 代码: public voi

我有一个方法,可以从我的数据库中读取文本文件,解析它并创建(或更新)实体。 代码很简单: 1-读取/解析文件并创建列表 2-在这个列表中循环,首先查看是否找到了产品,如果没有,它将创建它。 3-更新属性 4-将上下文保存到循环外部

问题是,在循环的每次迭代中,创建部分(if中的部分)花费的时间越来越长

我的问题是: 这是向上下文添加实体的最佳方法吗? 这能有所改善吗

我对实体框架非常陌生,不确定是否正确使用了它。 顺便说一句,上下文是在调用方法中创建的

谢谢你的建议

代码:

public void导入产品(MyContext上下文,字符串源文件)
{
List newProducts=ParseItems(sourceFile);
var currentProductsMap=context.Products.ToDictionary(x=>x.OriginalId,x=>x);
foreach(新产品中的var项目)
{
var id=item.OriginalId;
产品;
如果(!currentProductsMap.TryGetValue(id,输出产品))
{
product=context.Products.Create();
product.OriginalId=id;
context.Products.Add(产品);
}
product.UPC=string.Empty;
}
SaveChanges();
}

好的,所以放缓的明显原因是Entity Framework只在foreach完成后才提交数据,这意味着您可以轻松收集超过应用程序缓冲区的数据。一个简单的解决方法是定期调用submit/save,看看这是否会改变什么。跟踪您的内存使用情况


在您开始深入研究EF优化之前,我建议您先看一看,它是为快速插入大量数据而设计的。

好的,所以速度放缓的明显原因是实体框架只在完成foreach之后才提交数据,这意味着您可以轻松收集比应用程序缓冲区所能收集的数据更多的数据。一个简单的解决方法是定期调用submit/save,看看这是否会改变什么。跟踪您的内存使用情况


在您开始深入研究EF优化之前,我建议您先看一看,它是为快速插入大量数据而设计的。

以下几行可能会导致您的问题:

product = context.Products.Create();
这表示“为此集合的类型创建实体的新实例。请注意,此实例未添加或附加到集合。如果基础上下文配置为创建代理,并且实体类型满足创建代理的要求,则返回的实例将是代理。”

所以,似乎有可能在创建动态代理时做了您可能没有预料到的额外工作

也许您应该用以下方法再试一次:

var product = new Product();

以下行可能导致您的问题:

product = context.Products.Create();
这表示“为此集合的类型创建实体的新实例。请注意,此实例未添加或附加到集合。如果基础上下文配置为创建代理,并且实体类型满足创建代理的要求,则返回的实例将是代理。”

所以,似乎有可能在创建动态代理时做了您可能没有预料到的额外工作

也许您应该用以下方法再试一次:

var product = new Product();
public void导入产品(字符串文件)
{
使用(var context=new laceUpdatebase()){
context.Configuration.AutoDetectChangesEnabled=false;
if(上下文==null)
返回;
列出产品=项目(文件);
var productMap=context.Products.ToDictionary(x=>x.OriginalId,x=>x);
foreach(产品中的var项目){
var id=item.OriginalId;
产品;
bool-modified=false;
bool newItem=false;
if(!productMap.TryGetValue(id,out product)){
产品=新产品();
product.OriginalId=id;
修改=真;
newItem=true;
}
其他的
//这是对另一个实体的引用
if(product.Category!=null&&item.Category!=null&&product.Category.Id!=item.Category.Id){
context.Configuration.AutoDetectChangesEnabled=true;
product.Category=项目.Category;
//product.CategoryId=item.Category.Id;
修改=假;
SaveChanges();
context.Configuration.AutoDetectChangesEnabled=false;
}
if(newItem | | product.Code!=item.Code){
product.Code=项目.Code;
修改=真;
}
如果(新项目){
context.Products.Add(产品);
context.Entry(product.State=System.Data.Entity.EntityState.Added;
}
其他的
如果(修改)
context.Entry(product.State=System.Data.Entity.EntityState.Modified;
}
SaveChanges();
}
}
你好

这是我目前正在测试的代码,我仍然在使用AutoDetectChangesEnabled=false,因为它是最大的性能增益。 这带来的问题是,如果实体被更改为标记为已修改,我必须跟踪

然而,最大的问题是实体类型的一个属性的情况,由于某些原因,即使在将实例标记为修改后,该属性也没有被更新,因此我结束了需要将AutoDetectChangesEnabled设置为true、进行更改并将其持久化到DB的工作

同样,代码远不是很漂亮,但它很简单