2016-12-06 1 views
4

私はエンティティフレームワークを2、3年から使用していますが、今は少し問題があります。追加されたものの、保存されていない値に対するエンティティフレームワーククエリ

私は

Entities.dbContext.MyTable.Add(obj1); 

、ここで[OK]を、私のテーブルにエンティティを追加します。

その後、私は上記のコードはデシベルで私のMyTableとに照会します

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

のように、MyTableというの問い合わせをしたいのですが。

saveChangesの前に、ちょうど追加された値でクエリする方法はありますか? (obj1)どうやって?

UPDATE

は、なぜ私はこれが必要なのですか?私は追加それぞれの新しい要素のために、私が以前と次のレコードにいくつかの値を編集する必要があり、ので

アップデート2が

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

+2

を変更しますか?あなたはすでにオブジェクトを持っています、それは 'obj1'として保存されています –

+0

SaveChangesを呼び出すとすぐに、obj1にはプライマリキーのように保存されたものが含まれます - 再フェッチする必要はありません。 – Darren

+0

@AlfieGoodacre質問に答えるために編集しました:) –

答えて

5

あなたは、このような変更トラッカを経由して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); 
でこれを組み合わせることができます

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

+1

これは良い解決策です。しかし、それは私のためにはうまくいかなかった。私の場合、Entity.GetType()。NameにGUIDが追加されました。だから私はBaseTypeも考慮する。 (x => x.State == EntityState.Added &&(x.Entity.GetType)== typeof(MyTable)|| x.Entity.GetType()。BaseType == typeof(MyTable))) – RitchieD

+0

申し訳ありません遅延。このソリューションは完璧です!!!!!!! –

+0

「addedEntities」についてここでヒントを教えてもらえますか? http://stackoverflow.com/questions/41982691/one-databse-two-applications-two-dbconterxt –

0

これはトランザクションにとって良い状況だと思います。あなたがバージョンを提供していないので、EF 6を使用していると仮定します。あなたがしたいと思うのはなぜ=)

アップデート2は

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 Transactions

関連する問題