Entity Framework сохраняет только одну запись из списка

#c# #entity-framework #entity-framework-core

#c# #entity-framework #entity-framework-core

Вопрос:

Я пытаюсь вставить новую запись из TPOSTransaction и TPOSTransactionDetail

Приведенный ниже код взят из события в моем классе:

 _posTransaction = new TPostransaction();
_posTransactionDetail = new TPostransactionDetail();
_posTransactionDetails = new List<TPostransactionDetail>();

_posTransaction.UserId = _user.Id;
_posTransaction.Total = Convert.ToDecimal(txtOrderTotal.Text);
_posTransaction.ChangeDue = Convert.ToDecimal(txtChangeDue.Text);
_posTransaction.AmountPaid = Convert.ToDecimal(txtAmountPaid.Text);
_posTransaction.TransactionDate = DateTime.Now;

foreach (ListViewItem orders in lvOrders.Items)
{
   _posTransactionDetail.ItemId = Convert.ToInt32(orders.SubItems[1].Text);
   _posTransactionDetail.Quantity = Convert.ToInt32(orders.SubItems[3].Text);
   _posTransactionDetail.Subtotal = Convert.ToDecimal(orders.SubItems[4].Text) * Convert.ToDecimal(orders.SubItems[3].Text);
   _posTransactionDetails.Add(_posTransactionDetail);
}

    _posTransaction.TPostransactionDetail = _posTransactionDetails;
    _pos.Add(_posTransaction); //method from a class
  

Здесь я сохраняю запись:

Когда я пытаюсь отлаживать, POSTransaction.TposTransactionDetail получается 2 записи, поскольку это то, что я добавил из списка

 //this is my primary concern
var posTransaction = dbContext.TPostransaction.Add(POSTransaction);
dbContext.TPostransactionDetail.AddRange(POSTransaction.TposTransactionDetail);
dbContext.SaveChanges();
  

При этом сохраняются записи TPosTransaction и TPosTransactionDetail, но сохраняемая информация является только одной, а не двумя. Я попытался удалить AddRange часть, в которой она все еще сохраняет одну запись в моем TposTransactionDetail .

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

1. вместо _posTransactionDetail = new TPostransactionDetail(); в верхней части объявляйте TPostransactionDetail на каждой итерации цикла foreach. foreach (ListViewItem orders in lvOrders.Items) {var details = new TPostransactionDetail(); ...... _posTransactionDetails.Add(details);}

Ответ №1:

при каждом запуске вам нужно создать новый экземпляр TPostransactionDetail, вы просто повторно используете экземпляр в верхней части вашего кода.

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

1. и добавляет ее вручную в отдельный контекст для TPostransactionDetail?

2. потому что я думал, есть ли способ, с помощью которого я могу выполнить одно SaveChanges для всех, и почему AddRange не работает?

3. ef SaveChanges — это единица работы. Она сохранится как единое целое, вам просто нужно создать несколько экземпляров и добавить их в свой набор баз данных

4. с удовольствием, кабаян