c# - 使用 EF 和 SQLite 的 AddOrUpdate 语法
问题描述
我正在使用一种AddOrUpdate
方法来更新表条目。
我试过这段代码:
_db.Cars.AddOrUpdate(car => car.Id == Id, new Car()
{
CarBrand = ViewModel.Brand,
CarModel = ViewModel.Model,
CarNumber = ViewModel.Number,
EngType = ViewModel.EngType
});
通过使用这个我得到一个例外:
System.InvalidOperationException。
属性表达式car => Convert((car.Id == value(CarService.Windows.AddCarWindow).Car.Id))
无效。该表达式应表示一个属性:t => t.MyProperty
。指定多个属性时使用匿名类型:t => new { t.MyProperty1, t.MyProperty2 }
.
我需要帮助来编写表达式。
车类:
public class Car
{
public int Id { get; set; }
public string CarBrand { get; set; }
public string CarModel { get; set; }
public string CarNumber { get; set; }
public string EngType { get; set; }
}
解决方案
如果您知道您希望更新的汽车的 ID,只需将其设置在 Car 中并让 EF 对其进行排序(EF [应该,如果配置正确] 知道 Id 属性是关键)
_db.Cars.AddOrUpdate(new Car()
{
Id = ID_YOU_WANT_TO_UPSERT,
CarBrand = ViewModel.Brand,
CarModel = ViewModel.Model,
CarNumber = ViewModel.Number,
EngType = ViewModel.EngType
});
EF 将在数据库中查询您提供的 ID。如果找到,则应用更新。如果未找到,则插入完成。笔记; 如果您不指定每个属性,则任何未指定的属性都会在数据库端设置为 null,而不是被忽略..
就您遇到的错误而言,您正在使用的重载的第一个参数不应该指定标识要更新的对象的谓词,它应该列出应在 EF 创建的谓词中使用哪些属性确定平等。例如,如果您不知道 ID 并且 CarNumber 是唯一的,您可以通过以下方式根据 CarNumber 添加或更新:
_db.Cars.AddOrUpdate(car => car.CarNumber, new Car()
{
CarBrand = ViewModel.Brand,
CarModel = ViewModel.Model,
CarNumber = ViewModel.Number,
EngType = ViewModel.EngType
});
car=>car.CarNumber
EF 将根据您在第一个参数中提供的列和您在第二个参数 ( ) 中提供的值查找现有对象ViewModel.CarNumber
- 它将WHERE CarNumber = 1234
从这些
AddOrUpdate,AIUI,不再是一个东西——更新可以在最常见的场景中更新
推荐阅读
- asp.net-core - 使用 Microsoft.Extensions.DependencyInjection 创建子容器(或隔离范围)的最佳策略
- python - 将我的数据集分组为 2 个样本时出现 KeyError
- php - 在 Laravel 的数据透视表中播种数据的问题
- mysql - 将子查询中的列添加到主查询的 SELECT 中,而不在主查询中应用 WHERE 中的过滤器
- r - 如何在 R 中创建特定的周变量?
- python - 在输入法python3中输入许多值
- javascript - 画布停止重绘焦点丢失
- python - 如何防止pytest添加LogCaptureHandler?
- reactjs - 错误:无法对未安装的组件执行 React 状态更新
- laravel - 将嵌套的 eloquent 查询转换为列出子元素