C# AddObject后的实体框架查询

C# AddObject后的实体框架查询,c#,orm,entity-framework-4,C#,Orm,Entity Framework 4,上周我有一个错误,我试图重现。一段现有代码在数据库上进行了大量插入。但是,不允许在数据库中复制值。旧代码在每次使用SaveChanges的AddObject之后将更改保留到数据库中。这不是很好。因此,我不是每次在每1000条记录后保存它(并且在事务中这样做,但这与此示例无关),而是每次保存它 下面的代码概述了我所做的工作 TestEntities test = new TestEntities(); for (int i = 0; i < 10; i++)

上周我有一个错误,我试图重现。一段现有代码在数据库上进行了大量插入。但是,不允许在数据库中复制值。旧代码在每次使用SaveChanges的AddObject之后将更改保留到数据库中。这不是很好。因此,我不是每次在每1000条记录后保存它(并且在事务中这样做,但这与此示例无关),而是每次保存它

下面的代码概述了我所做的工作

        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();
TestEntities test=新的TestEntities();
对于(int i=0;i<10;i++)
{
对于(int j=0;j<10;j++)
{
字符串q=j.ToString();
if(!test.warehouses.Any(x=>x.combi==q))
{
仓库wh=新仓库();
wh.combi=j.ToString();
wh.ean=j.ToString();
test.warehouses.AddObject(wh);
}
}
}
test.SaveChanges();
我不知道的是,entity framework只查询数据库中的数据,而不是挂起的数据,因此any查询不会对数据库给出结果(我假设会有结果)。因此,这会导致上述代码中出现不需要的重复

现在,我解决了将所有即将添加的对象存储在内存中,然后将它们存储在数据库中的问题。这是可行的,但会给代码带来很大的开销。有办法解决这个问题吗?您能告诉EF处理数据库和挂起的更改吗?所有的ORM都是这样工作的吗

谢谢,
Patrick

面对类似的问题,我决定像您一样检查数据库并检查本地数据:

    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设计数据库,并使用默认或自定义(如果需要)T4模板运行优秀的反向工程代码优先

我试过当地的,但它说它不知道当地的。(首先与设计师一起使用数据库)@Patrick我首先使用代码,但如果无法识别本地,则ObjectStateManager可能会有所帮助:在工作的项目中,我们有一个codefirst项目,在那里我们有本地属性。谢谢