2015-09-26 24 views
2

我正在嘗試應用this blog中所述的工作模式單元,但遇到了以下問題:如果僅將相關的DbSet注入回購,例如,僅使用DbSet更新對象

public ArticleRepository(DbSet<Article> articles) 
{ 
    this.articles = articles; 
} 

那麼我該如何更新記錄或將其狀態設置爲已修改?

之前我用

public void Update(Article article) 
{ 
    this.context.Entry(article).State = EntityState.Modified; 
} 

但隨着新的方法,我沒有訪問的DbContext了。 DbSet.Add和DbSet.Attach都不能在這裏工作,所以我如何更新上下文中的對象?

+1

'IGenericRepository'應完全由您的設計。您可以添加一些方法來爲其中的實體設置狀態。這種界面真的看起來像一個包裝。所以如果可能的話,嘗試通過其他一些隱藏的界面暴露核心部分(DbContext,...)。在需要時,您可以隨時訪問核心以執行一些***高級***任務。作爲包裝,有時它不能像核心部件那樣提供完整的操作。對我而言,這種模式很大程度上取決於所謂的***包裝***。 – Hopeless

+0

1.您可以從'DbSet'訪問上下文。 2.不要注入'DbSet',注入上下文本身,然後使用上下文設置'this.articles'。 3.你知道你爲什麼抽象了背景嗎?實體框架上下文已經具有內置的工作單元機制。 – haim770

回答

3

System.Data.Entity.Migrations.IDbSetExtensions包含IDbSet擴展AddOrUpdate <TEntity>。這將更新實體。

有些人喜歡不知道他們是添加一個新實體還是改變一個現有的好處。

但是,如果你真的想要一個錯誤,如果你要更新的沒有添加的項目,看看在Source Code of IDbSetExtensions.AddOrUpdate

在這裏你可以看到,如果函數首先檢查的項目存在,並且根據結果添加或更新,如下所示:

var existing = set.SingleOrDefault 
    (Expression.Lambda<Func <TEntity, bool>> (matchExpression, new[] 
     {parameter})); 

if (existing != null) 
{ // entity exists: update it 
    foreach (var keyProperty in keyProperties) 
    { 
     keyProperty.Single().SetValue 
      (entity, keyProperty.Single().GetValue (existing, null), null); 
    } 
    internalSet.InternalContext.Owner.Entry(existing) 
     .CurrentValues.SetValues (entity); 
} 
else 
{ // not existing entity: Add it 
    internalSet.Add(entity); 
} 

如果你不想AddOrUpdate,但實際上只是一個更新,考慮爲IDbSet自己的擴展方法。請參閱Extension Methods (C# Programming Guide)