【问题标题】:Entity Framework, change column to Read-only实体框架,将列更改为只读
【发布时间】:2011-04-13 17:51:30
【问题描述】:

我正在使用 .NET 4.0、Entity Framework 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);

我的问题是:我应该把这个逻辑放在哪里,以确保在首次创建订单时计算名称?

谢谢。

【问题讨论】:

    标签: asp.net sql-server-2005 entity-framework entity-framework-4


    【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多