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