C# 实体框架查询刚添加但未保存的值

C# 实体框架查询刚添加但未保存的值,c#,sql,entity-framework,savechanges,C#,Sql,Entity Framework,Savechanges,我从几年前开始使用实体框架,现在有一个小问题 我将一个实体添加到我的表中 Entities.dbContext.MyTable.Add(obj1); 这里好 然后,我想对MyTable进行查询,如 Entities.dbContext.MyTable.Where(.....) 上面的代码将在数据库中查询MyTable 是否有一种方法可以在保存更改之前查询刚刚添加的值?(obj1)如何 更新 为什么我需要这个?因为,对于我添加的每个新元素,我需要编辑上一条和下一条记录中的一些值(此表中有一个d

我从几年前开始使用实体框架,现在有一个小问题

我将一个实体添加到我的表中

Entities.dbContext.MyTable.Add(obj1);
这里好

然后,我想对MyTable进行查询,如

Entities.dbContext.MyTable.Where(.....)
上面的代码将在数据库中查询MyTable

是否有一种方法可以在保存更改之前查询刚刚添加的值?(obj1)如何

更新

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

更新2


假设我必须添加很多对象,但我仅在添加最后一项后调用saveChanges。每次添加新项时,我都会读取其datetime字段,并在数据库中搜索上一条和下一条记录。在这里,我编辑上一条记录和下一条记录的字段。现在,问题是:如果我插入另一个项目,例如,下一个项目是“Obj1”,我必须找到并编辑它,但我找不到它,因为我没有保存我的更改。现在更清楚了吗?

您应该能够通过更改跟踪器将添加的实体从dbContext中取出,如下所示:

 var addedEntities = dbContext.ChangeTracker.Entries()
   .Where(x => x.State == EntityState.Added && x.Entity is Mytable)
   .Select(x => x.Entity as MyTable)
   .Where(t => --criteria--);
或使用:

因为您只查询添加的实体,所以可以将其与

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

要获取所有相关对象

我认为这对于事务来说是一个很好的情况。我假设您正在使用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(); 
            } 
        } 
    } 
}
public void BulkInsertObj(列表对象列表)
{
使用(var context=new dbContext())
{ 
使用(var dbContextTransaction=context.Database.BeginTransaction())
{  
尝试
{ 
foreach(对象列表中的变量obj1)
{
dbContext.MyTable.Add(obj1);
//obj1现在应该在上下文中
var previousEntity=dbContext.MyTable.Where(…)//如何确定
previousEntity.field=某物
var nextEntity=dbContext.MyTable.Where(…)//您如何确定这一点
nextEntity.field=somethingElse
}
SaveChanges();
dbContextTransaction.Commit();
} 
捕获(例外)
{ 
dbContextTransaction.Rollback();
} 
} 
} 
}

您为什么要这样做?您已经有了对象,只要调用SaveChanges,它就会存储为
obj1
,obj1将包含刚刚保存的任何内容,例如它的主键-无需重新获取。@AlfieGoodacre我编辑了这个问题来回答您:)@PieroAlberto我仍然很困惑,您拥有该对象,因此仍然可以使用它编辑其他对象values@Darren如果数据库中存在creationDate或其他计算的触发器,则不一定要重新加载对象才能获得这些值。这是一个很好的解决方案。然而,它并没有像现在这样对我起作用。在我的例子中,Entity.GetType().Name附加了一个GUID。所以我也考虑了基本类型。其中(x=>x.State==EntityState.Added&(x.Entity.GetType()==typeof(MyTable)| | x.Entity.GetType().BaseType==typeof(MyTable)))您能在这里给出一个关于“AddIdentity”的提示吗?你有没有办法不用ChangeTracker就能做到这一点?@onhax我认为没有简单的方法
ChangeTracker
是EF内部使用的,我相信中描述的
DbSet
Local
属性可能是一个更方便的选择
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(); 
            } 
        } 
    } 
}