【问题标题】:Entity Framework Code First Updating with Where Clause使用 Where 子句首先更新实体框架代码
【发布时间】:2013-03-21 01:35:28
【问题描述】:

我正在使用FilteredSet 自动获取系统当前登录用户的数据。它为我提供了一种从当前用户返回数据而不访问其他用户数据的动态方式。

我想在更新实体时做同样的事情。我可以使用 FilteredSet 从数据库中获取实体,如果实体 id 不属于用户抛出异常但我不想先加载实体并简单地附加这个实体并更新。

到目前为止,我已经尝试过:

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 查询是我希望实体框架生成的。 idUser 带有“AND”子句。

这可能吗?

【问题讨论】:

  • 您是否有理由不只是使用 .Where LINQ 扩展方法?例如:entity.Where(x=> x.id == 1 && x.idUser == 123)
  • 是的,需要每个开发者都添加这个条件。如果有人忘记了,那可能很危险。这就是为什么,使用动态的方式来做这件事很有趣,因为如果您将您的实体设置为我“标记”为由用户“拥有”,它将强制每次访问都链接到当前登录的用户。这是一些解释:patrickdesjardins.com/blog/…
  • 更新中也不能添加 Where 子句...

标签: c# .net entity-framework entity entity-framework-5


【解决方案1】:

EF 不提供开箱即用的功能来将 where 条件添加到 Update 语句。例如,您可以使用此开源项目中的 batch update。不同之处在于您的更新不会成为SaveChanges 调用的一部分(因为 EF 不支持它)。

【讨论】:

  • 开源项目看起来很棒!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多