如何将现有实体附加到泛型中的实体框架上下文中?
问题描述:
我想在实体框架6中加载一个带有AsNoTracking和LazyLoadingEnabled = false
的实体。在某些特殊情况下,我想显式重新加载一些集合。我如何显式加载分离实体的集合?如何将现有实体附加到泛型中的实体框架上下文中?
我正在寻找一个通用选项,将现有实体附加到上下文。
我的电话是这样的:
var myCar = await this.myCarRepositoryAccessor.GetById(this.UnitOfWork, 1).ConfigureAwait(false);
this.UnitOfWork.LoadCollection(myCar, e => e.Driver);
GetById在DataRepository与这个样子的:
public Task<TEntity> GetById(int id)
{
return id == 0
? Task.FromResult(default(TEntity))
: this.Context.InternalSet<TEntity>().AsNoTracking()?.SingleOrDefaultAsync(p => p.Id == id);
}
LoadCollection中的UnitOfWork样子:
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'类型的实体失败,因为另一个相同类型的实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时可能会发生这种情况。这可能是因为一些实体是新的并且还没有收到数据库生成的关键值。在这种情况下,使用'Add'方法或'Added'实体状态来跟踪图形,然后根据情况将非新实体的状态设置为'Unchanged'或'Modified'。
答
我想这是因为AsNoTracking()
,显式加载不起作用。
如果你想使用显式加载,你应该从你的getbyid方法中移除它。
还注意到,您可以将字符串与集合一起使用,而不是附加func,您可以简单地使用字符串或字符串列表,以防加载多个导航。
这也不错,对于收集用户知道你使用的收集和对单个实体导航,你应该使用参考
你能做的就是增加一个参数去你getbyid字符串列表,并包括所有的字符串的最好的事情在那个列表中,既然include也接受字符串。
您是否在加载集合之前尝试过附加实体?例如'this.context.Set().Attach(entity);' –
DavidG
我只想在某些特殊情况下重新加载集合。这是有效的,如果我以前给它,我知道。 –
对不起,我不明白你在那里说什么。 – DavidG