2016-12-06 70 views
4

我使用的實體框架來自幾年,現在我有一個小問題。對剛剛添加但未保存的值的實體框架查詢

我添加一個實體到我的表,用

Entities.dbContext.MyTable.Add(obj1); 

,在這裏確定。

然後,我想就MyTable的查詢,像

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

上面的代碼將在我的分貝MyTable的查詢。

有沒有一種方法可以查詢剛添加的值,之前的saveChanges? (obj1)如何?

UPDATE

爲什麼需要這個?因爲,對於每個新元素添加,我需要在一個和下一個記錄編輯一些值(也就是在這個表中的時間字段)

UPDATE2

比方說,我要加很多對象,但只有在添加最後一個項目後才調用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()。名稱附加了一個GUID。所以我也考慮BaseType。 Where(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

我認爲這是Transactions的一個很好的情況。我將假設您使用的是EF 6,因爲您沒有提供版本。 =)

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 Transactions

相關問題