2013-03-21 111 views
2

我正在使用FilteredSet從我係統的當前登錄用戶自動獲取數據。它爲我提供了一種動態的方式來返回當前用戶的數據,而不是訪問其他用戶的數據。實體框架代碼首先使用Where子句更新

我想在更新實體時也這樣做。我可以從數據庫中使用FilteredSet獲取實體,如果實體標識不屬於用戶拋出異常,但我寧願不先加載實體,只需附加此實例並進行更新。

到目前爲止,我已經嘗試:

public void UpdateOwnable<TEntity>(TEntity entity) where TEntity : class, IEntity, IUserOwnable 
{ 
     var entityLocal = SetOwnable<TEntity>().Local.SingleOrDefault(d => d.Id == entityId); 
     if (entityLocal==null) 
     { 
      entityLocal = this.SetOwnable<TEntity>().Attach(entity); 
     } 
     this.ChangeTracker.Entries<TEntity>().Single(d => d.Entity == entityLocal).State = EntityState.Modified; 
} 

的問題是,生成的查詢不包括WHERE子句。我希望找到一種方法,Where子句不僅是實體的主鍵,還有用戶ID。

Update Workout 
SET name .. 
WHERE id = 1 
AND idUser = 123; 

這個SQL查詢是我想讓Entity Framework生成的。使用idUser的「AND」子句。

這可能嗎?

+1

是否有一個原因,你不只是使用.Where LINQ擴展方法?例如:entity.Where(x => x.id == 1 && x.idUser == 123) – Justin 2013-03-21 01:43:30

+0

是的,它需要每個開發者都添加這個條件。如果有人忘記了,這可能是危險的。這就是爲什麼有一個動態的方法來做到這一點很有趣,因爲如果你將你的實體設置爲「標記」爲由用戶「擁有」,它將強制每個訪問鏈接到當前登錄的用戶。下面是一些解釋:http://patrickdesjardins.com/blog/using-a-filtereddbset-with-entity-framework-to-have-dynamic-filtering – 2013-03-21 01:52:55

+0

也不可能在更新中添加Where子句... – 2013-03-21 01:55:31

回答

4

EF不提供即裝即用的功能,以將條件添加到Update語句中。您可以使用此開源項目中的batch update等。區別在於您的更新不會成爲SaveChanges調用的一部分(因爲EF不支持它)。

+0

開源項目看起來不錯! – 2013-06-20 19:29:36

相關問題