В настоящее время я работаю над проектом, в котором мне нужно иметь возможность арендовать грузовик для клиента, но также необходимо добавить данные клиента, если они не существуют. Моя проблема в том, что даже несмотря на то, что через форму 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");
}
@RobinBennett, да, это код выше
@GraceDelosReyes какой уникальный ключ в таблице клиентов?
@Saif CustomerID
@GraceDelosReyes вы вводите CustomerId или генерируете автоматически?
@Saif Это автоматически сгенерировано
@GraceDelosReyes, у вас должно быть поле, чтобы различать пользователей, таких как электронная почта или имя, потому что автоматически сгенерированный идентификатор не будет различать
База данных работает по-разному в зависимости от того, есть ли у вас первичный ключ. Когда таблица имеет первичный ключ, у вас может быть только одна строка с тем же значением ключа. Если у таблицы нет первичного ключа, у вас может быть несколько строк с одним и тем же значением. когда существует первичный ключ, вы должны использовать «Обновить» для изменения значения и «Вставить» при добавлении нового ключа в таблицу.
@Saif Я подумал о licenseNumber из таблицы клиентов, но я не уверен, как отличить
Что такое DAD_TruckRental_RGMContext? Вы используете EntityFramework?
@RobinBennett Да, я использую структуру сущностей





Вот мое предложение
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();
}
}
Я надеюсь это тебе поможет
Похоже, проблема в методе DataService.rentTruck, а не в опубликованном вами коде. У вас есть к этому доступ?