2012-09-15 49 views
0

最后一个弱我有一个我尝试重新创建的错误。一块现有的代码在数据库上进行了批量插入。但是,数据库中的值不允许重复。旧代码在每次使用SaveChanges添加AddObject后都将更改保留到数据库中。这表现不佳。因此,不是每次我在每1000条记录后保存它(并在交易中完成此操作,但与此示例无关),而不是保存它。AddObject之后的实体框架查询

下面的这段代码给出了我做了什么的概述。

 TestEntities test = new TestEntities(); 

     for (int i = 0; i < 10; i++) 
     { 
      for (int j = 0; j < 10; j++) 
      { 
       string q = j.ToString(); 
       if (!test.warehouses.Any(x => x.combi == q)) 
       { 
        warehouse wh = new warehouse(); 
        wh.combi = j.ToString(); 
        wh.ean = j.ToString(); 
        test.warehouses.AddObject(wh); 
       } 
      } 

     } 
     test.SaveChanges(); 

我不知道那是什么让任何疑问给出了数据库没有结果的实体框架只查询数据库中的数据,而不是待处理的数据(和我是假设会有一个结果。 )因此,这会在上面的代码中导致不需要的重复。

现在我解决了它,以便尽快存储要添加到内存中的对象,然后将它们存储在数据库中。这会起作用,但会在代码中产生很多开销。有没有办法解决这个问题?你能告诉EF来处理数据库和待处理的更改吗?所有的ORM都是这样工作的吗?

感谢, 帕特里克

回答

1

有类似的问题,我决定检查数据库,你这样做,检查本地数据面对:

if(!test.warehouses.Local.Any(x => x.combi == q) 
     && !test.warehouses.Any(x => x.combi == q)) 

这应该工作。

编辑: 但它没有。然而,这并不:

var isLocal = (test as System.Data.Objects.ObjectContext).ObjectStateManager 
    .GetObjectStateEntries(System.Data.EntityState.Added) 
    .Any(x => (x.Entity as warehouse).combi == q); 
if(!isLocal && !test.warehouses.Any(x => x.combi == q)) { 
    // ... 
} 

我必须指出,IDbSet<>(通过我的代码,而不是第一次的ObjectSet<>通过模型设计器创建使用)具有.Local财产,所以没有必要查询ObjectStateManager。我知道代码首先是完全不同的东西,但您也可以非常高效:使用Microsoft SQL Server Management Studio设计数据库并运行优秀反向工程代码首先Entity Framework Power Tools使用默认或定制(如果需要)T4模板获得几乎任何东西http://en.wiktionary.org/wiki/your_mileage_may_vary

+0

我试过本地,但它说它不知道本地。 (首先与设计师一起使用数据库) – Patrick

+0

@Patrick我首先使用代码,但是如果Local无法识别[link](http://msdn.microsoft.com/en-us/library/gg679246(v = vs.103))。 aspx),那么ObjectStateManager可以帮助:[link](http://stackoverflow.com/a/6400097/551322) – nrodic

+0

在项目中,我们有一个codefirst项目,在那里我们有Local属性。谢谢。 – Patrick