2017-10-09 27 views
3

我想在實體框架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

回答

1

我想這是因爲AsNoTracking(),顯式加載不起作用。

如果你想使用顯式加載,你應該從你的getbyid方法中移除它。

還注意到,您可以將字符串與集合一起使用,而不是附加func,您可以簡單地使用字符串或字符串列表,以防加載多個導航。

這也不錯,對於收集用戶知道你使用的收集和對單個實體導航,你應該使用參考

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