#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