web-dev-qa-db-ja.com

追加されたが保存されていない値に対するエンティティフレームワーククエリ

私は数年前からEntityFrameworkを使用していますが、今は少し問題があります。

テーブルにエンティティを追加します。

Entities.dbContext.MyTable.Add(obj1);

そしてここで大丈夫。

次に、MyTableで次のようなクエリを実行します。

Entities.dbContext.MyTable.Where(.....)

上記のコードは、データベース内のMyTableに対してクエリを実行します。

saveChangesの前に、付加価値だけでクエリを実行する方法はありますか? (obj1)どうやって?

[〜#〜]更新[〜#〜]

なぜこれが必要なのですか?追加する新しい要素ごとに、前のレコードと次のレコードのいくつかの値を編集する必要があるためです(このテーブルには日時フィールドがあります)

UPDATE2

多くのオブジェクトを追加する必要があるとしましょう。ただし、最後のアイテムが追加された後でのみsaveChangesを呼び出します。新しいアイテムを追加するたびに、その日時フィールドを読み取り、データベースで前のレコードと次のレコードを検索します。ここでは、前のレコードと次のレコードのフィールドを編集します。ここで問題があります。たとえば、次のアイテムが「Obj1」の場合、別のアイテムを挿入すると、それを見つけて編集する必要がありますが、変更を保存していないため、見つけることができません。今はもっとはっきりしていますか?

10
Piero Alberto

次のような変更トラッカーを使用して、追加したエンティティをdbContextから取得できるはずです。

 var addedEntities = dbContext.ChangeTracker.Entries()
   .Where(x => x.State == EntityState.Added && x.Entity.GetType().Name == "MyTable")
   .Select(x => x.Entity as MyTable);

追加されたエンティティのみをクエリしているため、これをと組み合わせることができます

dbContext.MyTable.Where(x => -criteria-).ToList().AddRange(addedEntities);

関連するすべてのオブジェクトを取得するには

12
ste-fu

これはトランザクションにとって良い状況だと思います。バージョンを提供しなかったため、EF6を使用していると想定します。 =)

UPDATE2の変更

public void BulkInsertObj(List<TEntity> objList)
{
    using (var context = new dbContext()) 
    { 
        using (var dbContextTransaction = context.Database.BeginTransaction()) 
        {  
            try 
            { 
                foreach(var obj1 in objList)
                {
                    dbContext.MyTable.Add(obj1);

                    //obj1 should be on the context now 
                    var previousEntity = dbContext.MyTable.Where(.....) //However you determine this
                    previousEntity.field = something

                    var nextEntity = dbContext.MyTable.Where(.....) //However you determine this
                    nextEntity.field = somethingElse
                }

                context.SaveChanges(); 
                dbContextTransaction.Commit(); 
            } 
            catch (Exception) 
            { 
                dbContextTransaction.Rollback(); 
            } 
        } 
    } 
}

MSDN EF6トランザクション

1
Jared Stroebele