1

データベースにアクセスする前に検索するときに、ローカルで追跡されるエンティティを使用するEntityFrameworkでクエリを実行したいと思います。リポジトリ/データベースにデータを入力する複雑なルーチンを作成しましたが、Entity Frameworkを使用すると、すでに追加されているがまだ保存されていないエンティティは使用されません。したがって、このコードスニペットは、nを追加するのではなく、データベースに1つのカテゴリのみを追加する必要があります。

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からプロバイダーを変更できる抽象化があります。私は成功しませんでした。助けてください。

4

1 に答える 1

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プロバイダーを作成することは、非常に複雑な作業です。

編集:私はあなたがやろうとしていることがうまくいかない理由についてより詳細に説明しているこの投稿を見つけました。

ここでの特定の状況はわかりませんが、データストアにクエリを実行する前に、コレクションから重複を削除してみてください。上記のソリューションはこれを同時に行います。

お役に立てれば。

于 2012-08-08T22:37:45.940 に答える