如何将现有实体附加到泛型中的实体框架上下文中?

问题描述:

我想在实体框架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'。

+1

您是否在加载集合之前尝试过附加实体?例如'this.context.Set ().Attach(entity);' – DavidG

+0

我只想在某些特殊情况下重新加载集合。这是有效的,如果我以前给它,我知道。 –

+0

对不起,我不明白你在那里说什么。 – DavidG

我想这是因为AsNoTracking(),显式加载不起作用。

如果你想使用显式加载,你应该从你的getbyid方法中移除它。

还注意到,您可以将字符串与集合一起使用,而不是附加func,您可以简单地使用字符串或字符串列表,以防加载多个导航。

这也不错,对于收集用户知道你使用的收集和对单个实体导航,你应该使用参考

你能做的就是增加一个参数去你getbyid字符串列表,并包括所有的字符串的最好的事情在那个列表中,既然include也接受字符串。