实体框架,将列更改为只读

问题描述

| 我正在使用.NET 4.0,实体框架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);
我的问题是:在首次创建定单时,应在哪里放置此逻辑以确保计算名称? 谢谢。     

解决方法

一种方法是在数据库触发器中执行此操作。另一种方法是在覆盖的
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();
    }
}