我想在实体框架6中使用AsNoTracking和LazyLoadingEnabled = false
加载一个实体。在某些特殊情况下,我想显式重新加载某些集合。如何显式加载分离实体的集合?
我正在寻找一种通用选项,将现有实体附加到上下文中。
我的调用看起来像这样:
var myCar = await this.myCarRepositoryAccessor.GetById(this.UnitOfWork, 1).ConfigureAwait(false);
this.UnitOfWork.LoadCollection(myCar, e => e.Driver);
DataRepository中的GetById看起来像这样:
public Task<TEntity> GetById(int id)
{
return id == 0
? Task.FromResult(default(TEntity))
: this.Context.InternalSet<TEntity>().AsNoTracking()?.SingleOrDefaultAsync(p => p.Id == id);
}
UnitOfWork中的LoadCollection看起来像这样:
public void LoadCollection<TEntity, TElement>(TEntity entity, Expression<Func<TEntity, ICollection<TElement>>> navigationProperty) where TEntity : class, IEntity where TElement : class
{
//this.context.Entry(entity).State = EntityState.Unchanged
this.context.Entry(entity).Collection(navigationProperty).Load();
}
我尝试将实体状态设置为
Unchanged
,但出现以下错误消息:
附加类型为'MyCar'的实体失败,因为另一个相同类型的实体已经具有相同的主键值。当使用'Attach'方法或将实体状态设置为'Unchanged'或'Modified'时,如果图中的任何实体具有冲突的键值,则可能会发生这种情况。这可能是因为某些实体是新的,尚未接收到数据库生成的键值。在这种情况下,请使用'Add'方法或'Added'实体状态来跟踪图形,然后根据需要将非新实体的状态设置为'Unchanged'或'Modified'。
this.context.Set<TEntity>().Attach(entity);
- DavidG