问题描述
|
我正在使用.NET 4.0,实体框架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();
}
}