4

Я использую .NET 4.0, Entity Framework 4 и SQL Server 2005.Entity Framework, изменить колонку на чтение только

У меня есть существующая модель EF. У одного из объектов с именем Order есть столбец с именем Name (varchar 255), который имеет на нем уникальный ключ.

В прошлом значение в этом столбце определялось конечными пользователями, предоставляющими его значение в виде веб-формы. Значение было проверено другими в базе данных, чтобы обеспечить уникальную ценность перед отправкой формы.

Требования изменились так, что теперь значение этого столбца должно быть рассчитано при первом создании заказа и никогда не будет изменено впоследствии. Расчет включает подсчет количества существующих ордеров, у которых есть поле VariableNumber (varchar 255) с тем же значением. Для примера:

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

Мой вопрос заключается в следующем: где я ставлю эту логику, чтобы проверить имя вычисляется, когда заказ впервые создан?

Thank you.

ответ

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(); 
    } 
} 
Смежные вопросы