实体框架查询仅添加但未保存的值

时间:2016-12-06 15:47:15

标签: c# sql entity-framework savechanges

我使用Entity Framework几年了,现在我遇到了一些问题。

我使用

将一个实体添加到我的表中
Entities.dbContext.MyTable.Add(obj1);

这里好。

然后,我想在MyTable上进行查询,例如

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

上面的代码将在db中查询我的MyTable。

有没有办法在 saveChanges 之前查询刚添加的值? (obj1)怎么样?

更新

为什么我需要这个?因为,对于我添加的每个新元素,我需要在上一个和下一个记录中编辑一些值(此表中有一个datetime字段)

UPDATE2

我们说我必须添加很多对象,但只在添加最后一项后才调用saveChanges。每次添加新项目时,我都会读取其日期时间字段,并在数据库中搜索上一个和下一个记录。在这里,我编辑前一个和下一个记录的字段。现在,问题是:如果我插入另一个项目,例如,下一个项目是" Obj1",我必须找到并编辑它,但我找不到它,因为我没有& #39; t保存了我的更改。现在更清楚了吗?

2 个答案:

答案 0 :(得分:10)

您应该可以通过更改跟踪器从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 :(得分:1)

我认为交易是一个很好的情况。我假设您使用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