2013-03-21 109 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

相关问题