【问题标题】:Entity Framework query after AddObjectAddObject 之后的实体框架查询
【发布时间】:2012-09-15 14:13:33
【问题描述】:

上周我遇到了一个我试图重新创建的错误。一段现有代码在数据库上进行了大规模插入。虽然,一个值不允许在数据库中重复旧代码在每个 AddObject 之后使用 SaveChanges 将更改持久化到数据库中。这表现得不是很好。因此,不是每次我在每 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();

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

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

谢谢, 帕特里克

【问题讨论】:

    标签: c# orm entity-framework-4


    【解决方案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&lt;&gt;(由我的代码首先使用,而不是模型设计者创建的ObjectSet&lt;&gt;)具有.Local 属性,因此无需查询ObjectStateManager。我知道代码优先是完全不同的事情,但您也可以非常高效地使用它:使用 Microsoft SQL Server Management Studio 设计数据库并从 Entity Framework Power Tools 运行出色的 Reverse Engineer Code First 默认或自定义(如果需要)T4 模板来获取几乎任何东西。 http://en.wiktionary.org/wiki/your_mileage_may_vary

    【讨论】:

    • 我试过本地,但它说它不知道本地。 (首先与设计师一起使用数据库)
    • @Patrick 我首先使用代码,但如果 Local 无法识别 link 那么也许 ObjectStateManager 可以提供帮助:link
    • 在工作项目中,我们有一个 codefirst 项目,并且我们有 Local 属性。谢谢。
    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2013-03-17
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多