2017-09-26 61 views
1

我有两个实体(SaleInvoice和SaleInvoiceDetail)具有一对多关系。我添加的这段代码正在工作,但我想知道从这种导航属性(在我的SaleInvoiceDetails的案例列表中)更新或删除值的最佳做法是什么。这样做的最好方法是什么?更新和删除具有导航属性的实体的最佳做法

Here is Model designer view

private void bbUpdate_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) 
    { 
     var saleInvoiceInDb= _dbContext.SaleInvoices.Find(_id); 
     if (saleInvoiceInDb == null) return; 

     var saleInvoiceDetails = ((IEnumerable) gvSaleInvoiceDetails.DataSource).Cast<SaleInvoiceDetail>().ToList(); 

     using (var context = new ErpDbContext()) 
     { 
      foreach (var saleInvoiceDetail in saleInvoiceDetails) 
      { 
       if (saleInvoiceDetail.Id != 0) 
       { 
        var invoiceDetailInDb = context.SaleInvoiceDetails.Find(saleInvoiceDetail.Id); 
        invoiceDetailInDb = saleInvoiceDetail; 
        invoiceDetailInDb.SaleInvoiceId = saleInvoiceInDb.Id; 
       } 
       else 
       { 
        saleInvoiceDetail.SaleInvoiceId = saleInvoiceInDb.Id; 
        context.SaleInvoiceDetails.Add(saleInvoiceDetail); 
       } 

       context.SaveChanges(); 
      } 

     } 

     saleInvoiceInDb.CompleteDateTime = DateTime.Today; 
     saleInvoiceInDb.ContranctCode = ""; 
     saleInvoiceInDb.DateTimeAdded = DateTime.Now; 
     saleInvoiceInDb.DateTimeUpdated = DateTime.Now; 
     saleInvoiceInDb.DeliveryDateTime = txtDeliveryDate.DateTime; 
     saleInvoiceInDb.DueDateTime = txtDueDateTime.DateTime; 
     saleInvoiceInDb.InvoiceDescription = txtDescription.Text; 
     saleInvoiceInDb.InvoiceToAdress = txtinvoiceToAdress.Text; 
     saleInvoiceInDb.Period = new DateTime(txtPeriod.DateTime.Year, txtPeriod.DateTime.Month, 1); 
     saleInvoiceInDb.SaleType = txtSoType.Text; 
     saleInvoiceInDb.Status = (byte)txtStatus.ItemIndex; 
     saleInvoiceInDb.SupplierId = _supplierId; 
     saleInvoiceInDb.SupplierCode = txtSupplierCode.Text; 
     saleInvoiceInDb.SupplierInvoiceReference = ""; 
     saleInvoiceInDb.TransactionDateTime = txtTransactionDate.DateTime; 
     saleInvoiceInDb.OrderDate = txtOrderDate.DateTime; 
     saleInvoiceInDb.OrderPeriod = new DateTime(txtOrderDate.DateTime.Year, txtOrderDate.DateTime.Month, 1); 
     saleInvoiceInDb.UserAdded = clsUserProfile.US_LOGIN; 
     saleInvoiceInDb.UserUpdated = clsUserProfile.US_LOGIN; 
     _dbContext.SaveChanges(); 
     Messages.Information("Invoice updated successfully"); 
    } 
} 
+0

有一次,一位发言者说,试想一下,如果你去一个医生'cough'。然后,一年后,你会回来'发烧'。医生打开你的情况,删除“咳嗽”并增加“发烧”。换句话说,在某处注册您的交易... –

回答

0

您将需要另一个内,如果条件做删除:

if (saleInvoiceDetail.Id != 0) 
{ 
    var invoiceDetailInDb = context.SaleInvoiceDetails.Find(saleInvoiceDetail.Id); 
    if(invoiceDetailInDb == null) DoDelete(); 
    else{ 
     invoiceDetailInDb = saleInvoiceDetail; 
     invoiceDetailInDb.SaleInvoiceId = saleInvoiceInDb.Id; 
    } 
} 
+0

谢谢Amr Elgarhy为您的答案。您是否在您的项目中进行这种操作?这是最佳做法吗? – Nurlan

+0

@Nurlan我不认为这里有一个最佳实践,它是基于每个工作流程,所以在你的情况下,我会像你一样做。如果它正在工作,干净的代码,所以它没关系。 –

+0

我很困惑有点更新子元素一个实体因为我已经问过这个问题。非常感谢你 – Nurlan

相关问题