Entity framework 查询刚刚添加但未保存的值
Entity framework query on just added but not saved values
我使用 Entity Framework 几年了,现在有点问题。
我将一个实体添加到我的 table,
Entities.dbContext.MyTable.Add(obj1);
这里没问题。
然后,我想在 MyTable 上进行查询,例如
Entities.dbContext.MyTable.Where(.....)
上面的代码将在数据库中查询我的 MyTable。
有没有办法在 saveChanges 之前也查询刚刚添加的值? (obj1) 如何?
更新
为什么我需要这个?因为,对于我添加的每个新元素,我需要编辑上一条和下一条记录中的一些值(这个table中有一个日期时间字段)
更新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--);
或使用 type testing with pattern matching in 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);
获取所有相关对象
我认为这是交易的好情况。我假设您使用的是 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();
}
}
}
}
我使用 Entity Framework 几年了,现在有点问题。
我将一个实体添加到我的 table,
Entities.dbContext.MyTable.Add(obj1);
这里没问题。
然后,我想在 MyTable 上进行查询,例如
Entities.dbContext.MyTable.Where(.....)
上面的代码将在数据库中查询我的 MyTable。
有没有办法在 saveChanges 之前也查询刚刚添加的值? (obj1) 如何?
更新
为什么我需要这个?因为,对于我添加的每个新元素,我需要编辑上一条和下一条记录中的一些值(这个table中有一个日期时间字段)
更新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--);
或使用 type testing with pattern matching in 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);
获取所有相关对象
我认为这是交易的好情况。我假设您使用的是 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();
}
}
}
}