Синтаксис AddOrUpdate с использованием EF и SQLite

#c# #entity-framework #sqlite

#c# #entity-framework #sqlite

Вопрос:

Я использую AddOrUpdate метод для обновления записи в таблице.

Я пробовал этот код:

 _db.Cars.AddOrUpdate(car => car.Id == Id, new Car()
                                              {
                                                   CarBrand = ViewModel.Brand,
                                                   CarModel = ViewModel.Model,
                                                   CarNumber = ViewModel.Number,
                                                   EngType = ViewModel.EngType
                                              });
  

Используя это, я получаю исключение:

Система.Исключение InvalidOperationException.
Выражение свойств car => Convert((car.Id == value(CarService.Windows.AddCarWindow).Car.Id)) недопустимо. Выражение должно представлять свойство: t => t.MyProperty . При указании нескольких свойств используйте анонимный тип: t => new { t.MyProperty1, t.MyProperty2 } .

Мне нужна помощь в составлении выражения.

Класс Car:

 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; }
}
  

Ответ №1:

Если вы знаете идентификатор car, который, возможно, хотите обновить, просто установите его в 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 запросит у базы данных указанный вами идентификатор. Если найдено, применяется обновление. Если не найден, выполняется вставка. Примечание; если вы не укажете каждое отдельное свойство, любому неуказанному свойству присваивается значение null на стороне db, а не игнорируется..


С точки зрения ошибки, которую вы получаете, первый аргумент используемой вами перегрузки не должен указывать предикат, который идентифицирует объект для обновления, он должен указывать, какие свойства должны использоваться в предикате, созданном EF для определения равенства. Например, если вы не знаете, что идентификатор и номер карномера уникальны, вы можете добавить или обновить на основе номера карномера с помощью:

 _db.Cars.AddOrUpdate(car => car.CarNumber, new Car()
{
    CarBrand = ViewModel.Brand,
    CarModel = ViewModel.Model,
    CarNumber = ViewModel.Number,
    EngType = ViewModel.EngType
});
  

EF будет искать существующий объект на основе столбца, который вы указали в первом аргументе car=>car.CarNumber , и значения, которое вы указали во втором аргументе ( ViewModel.CarNumber ) — он создаст WHERE CarNumber = 1234 из них


AddOrUpdate, AIUI, больше не существует — обновление может быть отменено в большинстве распространенных сценариев

Комментарии:

1. Спасибо за вашу помощь, но это не помогло, у меня такое же исключение. И это свойство не указано, идентификатор по умолчанию равен 0.

2. Если вы получили то же исключение, то ничего не изменилось. Как выглядит ваш код после его изменения?

3. Я установил значение идентификатора нового автомобиля, как вы сказали. Исключение было в синтаксисе, а не в значениях. Во второй части кода, которую вам предлагают, я попробовал, и это сработало! Спасибо!

4. Проверил первое решение, которое вы предложили (после вашего редактирования), и оно тоже сработало!

5. Потрясающе .. обратите внимание на самый последний момент — осторожнее с AddOrUpdate, потому что я не уверен, что он больше не существует, поэтому, если вы напишете кучу кода, используя его, вам придется написать еще кучу кода, если вы обновите свой EF