首页 > 解决方案 > 使用 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; }
}

标签: c#entity-frameworksqlite

解决方案


如果您知道您希望更新的汽车的 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.CarNumberEF 将根据您在第一个参数中提供的列和您在第二个参数 ( ) 中提供的值查找现有对象ViewModel.CarNumber- 它将WHERE CarNumber = 1234从这些


AddOrUpdate,AIUI,不再是一个东西——更新可以在最常见的场景中更新


推荐阅读