Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 实体框架,将列更改为只读_Asp.net_Sql Server 2005_Entity Framework_Entity Framework 4 - Fatal编程技术网

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

Asp.net 实体框架,将列更改为只读,asp.net,sql-server-2005,entity-framework,entity-framework-4,Asp.net,Sql Server 2005,Entity Framework,Entity Framework 4,我正在使用.NET4.0、EntityFramework4和SQLServer2005 我有一个现有的EF模型。 其中一个名为Order的实体有一个名为Name(varchar 255)的列,该列上有一个唯一的键 过去,此列中的值由最终用户在web表单上提供其值来确定。在提交表单之前,已对照数据库中的其他值检查该值,以确保该值唯一 需求已更改,因此现在该列的值将在第一次创建订单时计算,并且以后不再更改。计算包括计算具有相同值的字段VariableNumber(varchar 255)的现有订单数

我正在使用.NET4.0、EntityFramework4和SQLServer2005

我有一个现有的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();
    }
}
public override void SaveChanges()
{
var orders=context.ObjectStateManager
.GetObjectStateEntries(EntityState.Add)
.选择(e=>e.Entity)
.of type();
如果(orders.Count()>0)
{
//序列化事务以锁定记录,因此
//该并发线程无法插入订单
//此线程准备时使用相同的名称
//它的命令
使用(var scope=new TransactionScope())
{
//这里获取可变数字的当前计数
foreach(订单中的var订单)
{
order.Name=。。。;
} 
base.SaveChanges();
scope.Complete();
}
}
其他的
{
//使用默认事务保存更改
base.SaveChanges();
}
}