0

I have read this post和理論我認爲很清楚。我有一個DAL,只有在數據庫中添加,獲取,更新和刪除信息的方法。如何在具有併發控制的.NET和EF應用程序中設計持久層?

所以我想我有一個應用程序,其中我有客戶端,訂單和類型的客戶端。客戶類型有一個百分比,用於設置客戶類型的折扣。

  • 商戶層向DAL請求客戶端的類型以瞭解折扣。
  • 商業層根據客戶的類型創建帶價格的訂單並應用折扣。
  • 業務層向DAL發送添加新訂單的命令,發送新訂單。

在代碼中我能有這樣的:

DAL:

public async getClientType(long paramIDClientType) 
{ 
    using(Entities myDbContext = new Entities()) 
    { 
     return await myDbContext.ClientTypes.Where(x=> x.IDType == paramIDClientType).SingleOrDefault(); 
    } 
} 


public async addOrder(Orders paramNewOrder) 
{ 
    using(Entities myDbContext = new Entities()) 
    { 
     myDbContext.Orders.Local.Add(paramNewOrder); 
     await myDbContext.SaveChangesAsync(); 
    } 
} 

經營業務層:

public void addOrderToClient(CLients paramClient) 
{ 
    ClientTypes myType = myDAL.getClientType(paramClient.IDClient); 

    ORder myNewOrder = myNewOder(); 
    myNewOrder.IDClient = paramClientIdCLient; 
    myNewOder.Amount = 300; 
    myNewOrder.Discount = myType.Discount; 
    myNewOder.Total = nyNewOrder.Total - myNewOder.Amount * myNewOder.Discount; 

    myDAL.AddOrder(nyNewOrder); 
} 

但我對於這種情況下的併發性問題,因爲我要確保我使用正確的折扣,所以我想避免某種類型的客戶端的折扣被另一個用戶改爲中間的過程添加新訂單。

如果我使用樂觀併發,我必須在我的ClientTypes表中有一個timestamp列,但這並不能解決我的問題,因爲在我的DAL層的addOrder方法中,我只傳遞參數作爲新的順序,所以方法不具有時間戳值,該時間戳值具有商業層來檢查客戶端的類型是否已經改變以確保使用的折扣是正確的。

所以我想在此解決方案:

public async addOrder(Orders paramNewOrder) 
{ 
    using(Entities myDbContext = new Entities()) 
    { 
     string sql = "select ct.* from ClientTypes as ct, CLients as c" 
      + " where ct.IdType = c.IdType and c.IdType = " + paramNewOrder.IdCLient; 

     ClientTypes myClientType = await myDbContext.CLientTypeSqlQuiery<CLientTypes>(sql).SingleOrDefaultAsync(); 

     if(paramNewOrder.Discount != myCLientType) 
     { 
      throw new Exception("Discount incorrect."); 
     } 

     paramNewOrder.Total = paramNewOrder.Amount - paramNewOrder.Amount * myClientType.Discount; 

     myDbContext.Orders.Local.Add(paramNewOrder); 
     await myDbContext.SaveChangesAsync(); 
    } 
} 

這是我的經營業務層,但是使用EF來獲取數據,所以我認爲這個解決方案合併DAL ABD經營業務層。這是真的?如果這是真的,我想這是一個不好的解決方案。但是,如何控制併發?

謝謝。

回答

1

是的,樂觀併發控制不能幫助您防止插入錯誤的新訂單,因爲您沒有提交ClientType。如果更改ClientType會在平均時間更改折扣時引發異常。

但仔細考慮要求。修改後是否使用正確的折扣毫秒真的是非常重要的?如果是這樣,你必須尋找一個鎖定機制。否則,只需在最後時刻獲取當前折扣,然後進行計算並提交訂單。

您可以在存儲過程中實現鎖定/計算/插入機制,該存儲過程映射到Order的插入操作。 EF can map CUD actions to stored procedures.

+0

那麼真的這是一個簡單的例子,也許很簡單。但想象一個用戶正在更新從開放到付款的訂單,並且我想避免第二個用戶向訂單添加新項目。有可能通過未付款價格的物品獲得付款訂單。我希望這個例子更清楚。 –

+1

這不是更清楚(你已經很清楚了),但它更好:)也許在這種情況下,如果你添加一個項目,你也應該總是更新訂單,所以如果訂單被修改,樂觀的併發將會啓動。否則,在這裏,你需要某種形式的鎖定。 –

+0

但是這是一個「假」更新的順序,因爲不需要,所以它是一個選項,但我仍然想知道這是假的更新還是新的併發。 –

相關問題