我希望能够不必首先执行DbContext.SaveChanges()就能定位新添加的EF Core实体(我的愿望源于我递归地添加实体,并且需要访问新添加的实体子实体中的实体,并且我希望最大程度地减少数据库更新。
将其放在上下文中,在以下伪代码中,entity2将为null,除非注释行未注释:
var entity1 = DbContext.Assemblies
.FirstOrDefault( x => x.Name.Equals( assemName, StringComparison.OrdinalIgnoreCase ) );
if( entity1 == null )
{
entity1 = new AssemblyDb()
{
Name = assemName,
};
DbContext.Assemblies.Add( retVal );
//DbContext.SaveChanges();
}
var entity2 = dbUpdater.DbContext.Assemblies
.FirstOrDefault( x => x.Name.Equals( assemName, StringComparison.OrdinalIgnoreCase ) );
几年前,有一个关于实体框架here的SO讨论。我很想看看在EF Core下是否有一种简单的方法可以达到相同的目的。
答案 0 :(得分:1)
您可以执行以下操作来访问ChangeTracker跟踪的所有条目:
foreach (EntityEntry entry in context.ChangeTracker.Entries())
{
var entityObject = entry.Entity;
}
更新:
尽可能使用Find()。
关于Find的好处是,它查看更改跟踪器,以查看本地上下文中是否已经存在具有该主键的对象,并且它将返回而无需查询数据库。
查找具有给定主键值的实体。如果上下文正在跟踪具有给定主键值的实体,那么将立即返回该实体,而无需向数据库发出请求。否则,将向数据库查询具有给定主键值的实体,如果找到该实体,则将该实体附加到上下文并返回。如果找不到实体,则返回null。