2017-02-16 5 views
0

私の知る限り、ユニット・オブ・ワークはすべてのリポジトリをパイプラインに保存し、後で1つのデータベース・トランザクションとしてプッシュします。私の下のシナリオに従って。リレーションシップのテーブルの作業単位を使用する汎用リポジトリ・パターン

public class Customer 
    { 
    [Key] 
    public int Id { get; set; } 
    public string CustomerId { get; set; } 
    public string Name { get; set; } 
    public string PhoneNumber { get; set; } 
    public string Address { get; set; } 
    public bool IsActive { get; set; } 
    } 

    public class Order 
    { 
    [Key] 
    public int Id { get; set; } 
    [ForeignKey("Customer")] 
    public int CustomerId { get; set; } 
    [ForeignKey("PaymentMode")] 
    public int PayModeId { get; set; } 
    public DateTime OrderDate { get; set; } 
    public bool IsActive { get; set; } 

    public Customer Customer { get; set; } 
    public PaymentMode PaymentMode { get; set; } 
    } 



    public class OrderProducts 
    { 
    [Key] 
    public int Id { get; set; } 
    [ForeignKey("Order")] 
    public int OrderId { get; set; } 
    [ForeignKey("Products")] 
    public int ProductId { get; set; } 
    public int Quantity { get; set; } 

    public Order Order { get; set; } 
    public Products Products { get; set; } 
    } 

public class DeliveryTrack 
{ 
    [Key] 
    public int Id { get; set; } 
    [ForeignKey("Order")] 
    public int OrderId { get; set; } 
    [ForeignKey("DeliveryStatus")] 
    public int DelStatusId { get; set; } 
    public float TotalAmount { get; set; } 
    public bool IsActive { get; set; } 

    public Order Order { get; set; } 
    public DeliveryStatus DeliveryStatus { get; set; } 
    } 

クラスOrderは、OrderProductsために挿入されていないが、それはDeliveryTrackために挿入されたDBレコードにOrderProductsDeliveryTrack によって参照されます。 DeliveryTrackが除外され、むしろ私が言う場合

ObjUow.GetRepository<OrderProducts>().Insert(objOrderProducts); 
ObjUow.Save(); 

それは働いています。 2つのエンティティによって参照されるOrderに問題がありますか?

助けてください。

public int AddOrderDetailsOms(CustomerDto customerDto,PaymentModeDto 
paymentDto, OrderProductsDto orderProductsDto)   
{ 
    using (var dbContextTransaction = ObjUow.BeginDataTransaction()) 
    { 
    try 
    { 
     Customer objCustomer = new Customer 
     { 
      // CustomerId = customerDto.CustomerId, 
      Name = customerDto.Name, 
      Address = customerDto.Address, 
      PhoneNumber = customerDto.PhoneNumber, 
      IsActive = true 
     }; 

     Order objOrder = new Order 
     { 
      OrderDate = DateTime.Now, 
      IsActive = true, 
      PayModeId = paymentDto.Id, 
      Customer = objCustomer 
     }; 



     if (orderProductsDto != null) 
     { 
      foreach (var prodId in orderProductsDto.ProductId) 
      { 
       OrderProducts objOrderProducts = new OrderProducts 
       { 
        // OrderId = orderId, 
        ProductId = prodId, 
        Quantity = 1, 
        Order = objOrder 
       }; 

      } 
     } 

     DeliveryTrack objDeliveryTrack = new DeliveryTrack 
     { 
      // OrderId = orderId, 
      DelStatusId = 1, 
      TotalAmount = 120.00f, 
      Order = objOrder 
     }; 

     ObjUow.GetRepository<DeliveryTrack>().Insert(objDeliveryTrack); 
     ObjUow.Save(); 

     dbContextTransaction.Commit(); 
     return 1; 
    } 
    catch (Exception ex) 
    { 
     dbContextTransaction.Rollback(); 
     throw ex; 
    } 
} 
} 

答えて

1

最初にお客様を挿入する必要はありません。顧客を作成して注文に顧客を追加し、注文を挿入するだけです。だからこのような何かがうまくいくはずです:

Customer objCustomer = new Customer 
{ 
    CustomerId = customerDto.CustomerId, 
    Name = customerDto.Name, 
    Address = customerDto.Address, 
    PhoneNumber = customerDto.PhoneNumber, 
    IsActive = true 
}; 

Order objOrder = new Order 
{ 
    OrderDate = DateTime.Now, 
    IsActive = true, 
    PayModeId = paymentDto.Id, 
    Customer = objCustomer 
}; 
ObjUow.GetRepository<Order>().Insert(objOrder); 
ObjUow.Save(); 
+0

それは素晴らしいです、ガレッブ、本当にありがとう、それは完璧に動作しています。 – Chinmay

+0

FYI、あなたのリポジトリのInsert()がDBContext.Add()を呼び出していると推測しています。Add()メソッドはオブジェクトグラフ全体を正しい順序で正しく更新します。あなたも同様に支払いを行うことができます。それ以外の方法で顧客に注文リストを追加して顧客を挿入しても、それでも機能します。 – garethb

+0

info garethbありがとう、私はそれをチェックします。ボトルネックの点で私を助けてください。 – Chinmay

関連する問題