2012-08-08 88 views
1

我希望在实体框架中执行查询时使用本地跟踪的实体在数据库之前进行搜索时。我写了一个复杂的例程来填充存储库/数据库,现在当我使用实体框架时,它不会使用已经添加但尚未保存的实体。因此,这段代码只能将一个类别添加到数据库中,而不是添加n。实体框架查询本地默认

using (Db Db = new Db()) { 
    for (int i = 0; i < 10; i++) { 
     Category Category = Db.Categories.SingleOrDefault(x => x.Name == "Hello"); 
     if (Category == null) { 
      Category = Db.Categories.Create(); 
      Category.Name = "Hello"; 
      Db.Categories.Add(Category); 
      Console.WriteLine("Adding item..."); 
     } 
    } 
} 

我该如何去做这件事?我有一个抽象,它允许我从IQueryable中更改提供者,我尝试使用它来首先访问Local集合。我没有成功。请帮忙。

+1

我很好奇。您将如何计划查询尚未保存的实体?任何数据库生成的id都是0,因为它们还没有被创建。所以没有身份。当然,你可以查询其他的东西,但它看起来很蹩脚而且很差。为什么不保留自己的项目集合并将linq用于对象呢? – 2012-08-08 22:50:37

回答

1

这是一个非常简单,易于阅读的方式,虽然它可能不是你想找的是什么:

using (Db Db = new Db()) { 
    var newCategories = new List<Category>(); 
    for (int i = 0; i < 10; i++) { 
     Category category = newCategories.SingleOrDefault(x => x.Name == "Hello"); 
     if (category == null) { 
      category = Db.Categories.SingleOrDefault(x => x.Name == "Hello"); 
      if (category == null) { 
       category = Db.Categories.Create(); 
       category.Name = "Hello"; 
       Db.Categories.Add(category); 
       newCategories.Add(category); 
       Console.WriteLine("Adding item..."); 
      } 
     } 
    } 
} 

编写自己的IQueryable的供应商是一个非常复杂的任务。

编辑:我发现this post它更详细地说明了为什么你试图做的不起作用。

想到我不知道你的特定情况在这里,你应该在查询到数据存储之前尝试删除集合中的重复项。上述解决方案在同一时间执行此操作。

希望这会有所帮助。