4

.NET 4.0、Entity Framework 4、およびSQL Server 2005を使用しています。Entity Framework、列を読み取り専用に変更

私は既存のEFモデルを持っています。 Orderという名前のエンティティの1つに、固有のキーを持つName(varchar 255)という名前の列があります。

これまで、この列の値は、エンドユーザーがWebフォームにその値を提供することによって決定されました。この値はデータベース内の他のユーザーと比較してチェックされ、フォームを送信する前に一意の値を確認します。

要件が変更されたため、この列の値は最初に注文が作成された時点で計算され、後で変更されることはありません。計算には、同じ値を持つフィールドVariableNumber(varchar 255)を持つ既存のOrdersの数を数えます。例:

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

私の質問は次のとおりです。注文が最初に作成されたときに名前が計算されるようにするには、このロジックをどこに入れますか?

ありがとうございます。

答えて

1

1つのアプローチは、データベーストリガーでこれを実行しています。もう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(); 
    } 
} 
関連する問題