【问题标题】:Entity Framework Query Local By Default实体框架查询本地默认
【发布时间】:2014-07-18 09:56:50
【问题描述】:

我想在 Entity Framework 中执行查询,这些查询在访问数据库之前进行搜索时使用本地跟踪的实体。我编写了一个复杂的例程来填充存储库/数据库,现在当我使用实体框架时,它不会使用已经添加但尚未保存的实体。因此,这段 sn-p 代码应该只向数据库添加一个 Category,而不是添加 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 集合。我没有成功。请帮忙。

【问题讨论】:

  • 我很好奇。您打算如何查询尚未保存的实体?任何数据库生成的 id 都将为 0,因为它们尚未创建。所以没有身份。当然,您可以查询其他内容,但这似乎很老套且实践不佳。为什么不保留自己的项目集合并使用 linq to objects 来对付它?

标签: c# asp.net asp.net-mvc entity-framework


【解决方案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 更详细地说明了您尝试做的事情为什么不起作用。

我不知道您的具体情况是什么,您应该在查询数据存储之前尝试从您的集合中删除重复项。上述解决方案同时做到了这一点。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多