我想从@where获取数据库中的所有记录,然后更新它们。为此,我创建了一个这样的查询:
public async Task MarkAllAsActive()
{
var currentUserId = _userManager.GetCurrentUserId();
await _workOrders.Where(row => row.Status == WorkOrderStatus.Draft).ForEachAsync(row =>
{
row.Status = WorkOrderStatus.Active;
_uow.MarkAsChanged(row, currentUserId);
});
}
但是这个查询选择了数据库中所有不好的字段。要解决此问题,我尝试仅选择ID
,Status
:
public async Task MarkAllAsActive()
{
var currentUserId = _userManager.GetCurrentUserId();
await _workOrders.Select(row=>new WorkOrder { Id=row.Id,Status=row.Status}).Where(row => row.Status == WorkOrderStatus.Draft).ForEachAsync(row =>
{
row.Status = WorkOrderStatus.Active;
_uow.MarkAsChanged(row, currentUserId);
});
}
但它会返回此错误:
无法在LINQ to Entities查询中构造实体或复杂类型“DataLayer.Context.WorkOrder”。
我看过类似帖子和同样的错误,但我的问题不同,因为我想更新。
我该怎么做?
答案 0 :(得分:1)
可悲的是,你必须获取整个实体。 为了使用EF更新实体,编辑的类类型必须是DbContext映射实体。
如果您想更新而不向服务器提取实体,而不编写任何SQL ,则可以使用Entity Framework Extended Library。
请参阅网站上的更新部分。
答案 1 :(得分:0)
在您的情况下获取同一实体中的实体将不起作用,因为您只获得选定的列。例如您将再次在WorkOrder中获取WorkOrder实体。 我建议您使用DTO仅加载选定的列。它应该工作。但在更新时,您必须将其复制到db对象。