asp.net - Entity Framework ,将列更改为只读

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

我正在使用 .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);

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

谢谢。

最佳答案

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

关于asp.net - Entity Framework ,将列更改为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5653413/

相关文章:

asp.net - 验证摘要控件未显示消息?

c# - 在 asp.net c# 中对数据集进行排序

sql-server-2005 - 无法从 SQL Server 查询中获得正确的输出

sql - 如何修复 Windows NT 用户或组 'IIS APPPOOL\DefaultAppPool' 未找到?

sql-server - 在 Ms Sql Server 2005 中检查约束

Asp.net web api + Entity Framework : multiple requests cause data conflict

c# - SQL Server - DATEDIFF 函数耗时太长

c# - Response.Redirect 给出 HttpException 异常

c# - Ria 服务和导航属性问题

asp.net - 配置 Visual Studio 2013 以允许 ASPNETCOMPILER 使用 x64 编译器进行预编译