我使用Entity Framework几年了,现在我遇到了一些问题。
我使用
将一个实体添加到我的表中Entities.dbContext.MyTable.Add(obj1);
这里好。
然后,我想在MyTable上进行查询,例如
Entities.dbContext.MyTable.Where(.....)
上面的代码将在db中查询我的MyTable。
有没有办法在 saveChanges 之前查询刚添加的值? (obj1)怎么样?
更新
为什么我需要这个?因为,对于我添加的每个新元素,我需要在上一个和下一个记录中编辑一些值(此表中有一个datetime字段)
UPDATE2
我们说我必须添加很多对象,但只在添加最后一项后才调用saveChanges。每次添加新项目时,我都会读取其日期时间字段,并在数据库中搜索上一个和下一个记录。在这里,我编辑前一个和下一个记录的字段。现在,问题是:如果我插入另一个项目,例如,下一个项目是" Obj1",我必须找到并编辑它,但我找不到它,因为我没有& #39; t保存了我的更改。现在更清楚了吗?
答案 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();
}
}
}
}