4

我正在使用.NET 4.0,Entity Framework 4和SQL Server 2005.實體框架,將列更改爲只讀

我有一個現有的EF模型。 其中一個名爲Order的實體具有名爲Name(varchar 255)的列,該列上具有唯一鍵。

過去,此列中的值由最終用戶在Web表單上提供其值。該值與數據庫中的其他人進行覈對,以確保在提交表單之前具有唯一值。

需求已更改,現在此列的值將在首次創建訂單時計算,並且之後從未更改。計算涉及計算具有相同值的字段VariableNumber(varchar 255)的現有訂單的數量。例如:

int count = this.Orders.Where(o => o.VariableNumber == variableNumber).Count(); 
++count; 
return string.Format("{0}-{1:000}", variableNumber, count); 

我的問題是這樣的:我在哪裏把這個邏輯,以確保該名稱首次創建訂單時計算出來的?

謝謝。

回答

1

一種方法是在數據庫觸發器中執行此操作。另一種方法是覆蓋SaveChanges

public override void SaveChanges() 
{ 
    var orders = context.ObjectStateManager 
         .GetObjectStateEntries(EntityState.Added) 
         .Select(e => e.Entity) 
         .OfType<Order>(); 

    if (orders.Count() > 0) 
    { 
     // serialized transaction to lock records so 
     // that concurrent thread can't insert orders 
     // with the same name while this threads preparing 
     // its orders 
     using (var scope = new TransactionScope()) 
     { 
      // Here get current counts for variable numbers 

      foreach (var order in orders) 
      { 
       order.Name = ...; 
      } 

      base.SaveChanges(); 
      scope.Complete(); 
     } 
    } 
    else 
    { 
     // saving changes with default transaction 
     base.SaveChanges(); 
    } 
}