繁体   English   中英

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

[英]Entity framework query on just added but not saved values

几年来我一直在使用 Entity Framework,现在我遇到了一个小问题。

我在我的表中添加了一个实体,

Entities.dbContext.MyTable.Add(obj1);

好的。

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

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

上面的代码将在数据库中查询我的 MyTable。

有没有办法在saveChanges之前查询刚刚添加的值? (obj1)如何?

更新

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

更新2

假设我必须添加很多对象,但我仅在添加最后一个项目后才调用 saveChanges。 每次我添加新项目时,我都会读取它的日期时间字段,并在数据库中搜索上一条和下一条记录。 在这里,我编辑了上一条记录和下一条记录的字段。 现在,问题来了:如果我插入另一个项目,例如,下一个项目是“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--);

或者在 c# 7.0 中使用带有模式匹配的类型测试

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

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

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

获取所有相关对象

我认为这对 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 事务

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM