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();
}
}
}
}