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