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

4
我正在使用.NET 4.0,Entity Framework 4和SQL Server 2005。
我有一个现有的EF模型。其中一个名为Order的实体具有一个名为Name(varchar 255)的列,该列上有一个唯一键。
过去,在Web表单上,最终用户通过提供其值来确定此列中的值。在提交表单之前,检查该值是否与数据库中的其他值相同以确保唯一性。
要求已更改,因此此列的值将在创建Order时第一次计算,并且以后永远不会更改。计算涉及计算具有相同值的字段VariableNumber(varchar 255)的现有订单数量。例如:
int count = this.Orders.Where(o => o.VariableNumber == variableNumber).Count();
++count;
return string.Format("{0}-{1:000}", variableNumber, count);

我的问题是:在哪里放置这个逻辑以确保在创建订单时计算名称?谢谢。
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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接