2017-09-26 3 views
1

1対多リレーションシップを持つ2つのエンティティ(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'と医者に行く場合を想像してみてください。それから1年後、あなたは「熱」に戻ります。医者はあなたのケースを開き、「咳」を削除して「発熱」を追加します。言い換えれば、あなたの取引をどこかに登録してください。 –

答えて

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

関連する問題