Как оставить существующие данные без изменений, если условие ложно

В настоящее время я работаю над проектом, в котором мне нужно иметь возможность арендовать грузовик для клиента, но также необходимо добавить данные клиента, если они не существуют. Моя проблема в том, что даже несмотря на то, что через форму WPF я ввожу те же самые данные о клиенте, будет добавлен новый набор данных, что приведет к созданию нового идентификатора клиента для одного человека. Как я могу получить базу данных без учета существующих данных о клиентах?

Мой код службы данных:

 public class DataService
{
    public static void rentTruck(TruckRental toRent, bool isNewCustomer)
    {
        using (var ctx = new DAD_TruckRental_RGMContext())
        {

            if (!isNewCustomer)
            {

                ctx.Entry(toRent.Customer).State = EntityState.Unchanged;//doesnt leave existing customer unchanged
            }
            ctx.Entry(toRent.Truck).State = EntityState.Modified;
            ctx.TruckRental.Add(toRent);
            ctx.SaveChanges();
        }
    }

Мой код cs:

private void Button_Click(object sender, RoutedEventArgs e)
    {

            TruckCustomer cust = new TruckCustomer();
            cust.Age = int.Parse(ageTextBox.Text);
            cust.LicenseNumber = licenseNumberTextBox.Text;
            cust.LicenseExpiryDate = licenseExpiryDateDatePicker.SelectedDate.Value.Date;


            TruckPerson per = new TruckPerson();
            per.Address = addressTextBox.Text;
            per.Telephone = telephoneTextBox.Text;
            per.Name = nameTextBox.Text;

            cust.Customer = per;


            int truckId = int.Parse(truckIdTextBox.Text);
            IndividualTruck truck = DataService.searchTruckByID(truckId);

            decimal priceTotal = decimal.Parse(totalPriceTextBox.Text);

            TruckRental toRent = new TruckRental();
            toRent.TotalPrice = priceTotal;
        toRent.RentDate = rentDateDatePicker.SelectedDate.Value.Date;

        toRent.ReturnDueDate = returnDueDateDatePicker.SelectedDate.Value.Date;
            toRent.Customer = cust;
            toRent.Truck = truck;
            truck.Status = "Rented";


            DataService.rentTruck(toRent, true);

            MessageBox.Show("Truck rented succesfully");


    }

Похоже, проблема в методе DataService.rentTruck, а не в опубликованном вами коде. У вас есть к этому доступ?

Robin Bennett 19.11.2018 10:42

@RobinBennett, да, это код выше

Grace 19.11.2018 10:44

@GraceDelosReyes какой уникальный ключ в таблице клиентов?

Saif 19.11.2018 10:52

@Saif CustomerID

Grace 19.11.2018 10:53

@GraceDelosReyes вы вводите CustomerId или генерируете автоматически?

Saif 19.11.2018 10:54

@Saif Это автоматически сгенерировано

Grace 19.11.2018 10:54

@GraceDelosReyes, у вас должно быть поле, чтобы различать пользователей, таких как электронная почта или имя, потому что автоматически сгенерированный идентификатор не будет различать

Saif 19.11.2018 10:56

База данных работает по-разному в зависимости от того, есть ли у вас первичный ключ. Когда таблица имеет первичный ключ, у вас может быть только одна строка с тем же значением ключа. Если у таблицы нет первичного ключа, у вас может быть несколько строк с одним и тем же значением. когда существует первичный ключ, вы должны использовать «Обновить» для изменения значения и «Вставить» при добавлении нового ключа в таблицу.

jdweng 19.11.2018 10:58

@Saif Я подумал о licenseNumber из таблицы клиентов, но я не уверен, как отличить

Grace 19.11.2018 10:58

Что такое DAD_TruckRental_RGMContext? Вы используете EntityFramework?

Robin Bennett 19.11.2018 11:00

@RobinBennett Да, я использую структуру сущностей

Grace 19.11.2018 11:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
88
1

Ответы 1

Вот мое предложение

1- Сначала проверьте, существует ли уже информация о клиенте в базе данных с помощью LicenseNumber 2- Первым шагом будет либо null, либо детали, поэтому, если значение равно null, добавьте полученные данные о клиенте, в противном случае обновите

вот код

public class DataService
{
    public static void rentTruck(TruckRental toRent, bool isNewCustomer, TruckCustomer tcustomer)
    {
        using (var ctx = new DAD_TruckRental_RGMContext())
        {
           var ob =  ctx.TruckCustomer.Where(c => c.LicenseNumber   == customer.LicenseNumber);
           if ( ob != null) //not exist 
            {

            //create new here 
            ctx.TruckCustomer.Add(tcustomer);
        }

        //exist then just update State
        ctx.ob.State = EntityState.Modified;
        ctx.AddOrUpdate(ob);
        ctx.TruckRental.Add(toRent);
        ctx.SaveChanges();
    }
}

Я надеюсь это тебе поможет

Другие вопросы по теме