Entity Framework, изменить столбец только для чтения - PullRequest
4 голосов
/ 13 апреля 2011

Я использую .NET 4.0, Entity Framework 4 и SQL Server 2005.

У меня есть существующая модель 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);

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

Спасибо.

1 Ответ

1 голос
/ 13 апреля 2011

Один из подходов - сделать это в триггере базы данных.Другой подход заключается в переопределении 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();
    }
}
...