如何在联接查询中的两个表中更新具有相同名称的两列

时间:2019-07-19 18:12:10

标签: sql linq

我遇到错误:

  

无法将属性或索引器分配给“-”,这是只读的

当尝试在联接查询的两个表中更新两个具有相同名称的列时。我该如何工作?谢谢!

enter image description here

2 个答案:

答案 0 :(得分:1)

在您的投影中创建的匿名对象(“选择新的”部分)是只读的,并且数据上下文不会以任何方式跟踪其属性。

相反,您可以尝试以下操作:

//...
select new 
{
    p1 = p,
    p2 = t
}

foreach (var row in updates)
{
    row.p1.Processed = true;
    row.p2.Processed = true;
}

为了提高性能,您可能还需要查看Entity Framework Extensions的批处理更新功能(如果使用的是Entity Framework):https://entityframework-extensions.net/overview

答案 1 :(得分:1)

是的,这是由于匿名类型属性是只读的,来自documentation

  

匿名类型提供了一种方便的方法来封装一组   将只读属性放入单个对象,而无需显式   首先定义类型。

我建议您使用所需的两个实体(DTO)创建一个自定义类:

public class PassengerDTO
{
  public Passenger Passenger {get;set}
  public PassengerItinerary PassengerItinerary {get;set}
}

并在投影中使用它,您需要实体实例,而不仅仅是您想要修改的属性,因为在修改Processed代表您的实体的代理类中的foreach属性时,会将您实体的状态更改为Updated