2017-09-26 2 views
1

Ich habe zwei Entitäten (SaleInvoice und SaleInvoiceDetail) mit einer zu vielen Beziehungen. Dieser Code, den ich hinzugefügt habe, funktioniert, aber ich frage mich, was ist die beste Methode, um Werte von dieser Art von Navigationseigenschaft (in meinem Fall Liste von SaleInvoiceDetails) zu aktualisieren oder zu löschen. Was ist der beste Weg, das zu tun?Best Practice Aktualisieren und Löschen einer Entität mit Navigationseigenschaft

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

Eine Zeit, sagte ein Sprecher, Stellen Sie sich vor, wenn Sie mit 'cough' zu einem Arzt gehen. Dann, ein Jahr später, kommst du mit 'Fieber' zurück. Doktor öffnet Ihren Fall, löscht "Husten" und fügt "Fieber" hinzu. Mit anderen Worten, registrieren Sie Ihre Transaktionen irgendwo ... –

Antwort

0

Sie das Löschen, wenn die Bedingung eine andere innere benötigen dafür:

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

Vielen Dank Amr Elgarhy für Ihre Antwort. Wie machen Sie diese Art von Operation in Ihren Projekten? Ist das eine Best Practice? – Nurlan

+0

@Nurlan Ich denke nicht, dass es hier eine Best Practice gibt, es basiert auf jedem Workflow, also werde ich es in Ihrem Fall genauso machen wie Sie. Wenn es funktioniert, sauberen Code, so ist es in Ordnung. –

+0

Ich verwechsle ein wenig update Kind Elemente eine Entität wegen dieser Ich habe diese Frage .thank Sie sehr gefragt – Nurlan

Verwandte Themen