我的工作区不使用主键的标识列或GUID。相反,我们根据需要从表中检索“下一个ID”,并为每个插入增加值。
对我来说不幸的是,LINQ-TO-SQL似乎围绕使用标识列进行了优化。因此,每当我执行插入操作时,我都需要查询和更新“NextId”表。为简单起见,我在创建新对象时执行此操作:
var db = new DataContext( "...connection string..." );
var car = Car
{
Id = GetNextId<Car>( db ),
TopSpeed = 88.0
};
db.InsertOnSubmit( car );
db.SubmitChanges();
GetNextId方法是这样的:
public int GetNextId<T>( DataContext db )
{
using ( var transaction = new TransactionScope ( TransactionScopeOption.RequiresNew ) )
{
var nextId = (from n in db.GetTable<NextId> ()
where n.TableName == typeof(T).Name
select n).Single ();
nextId.Value += 1;
db.SubmitChanges ();
transaction.Complete ();
return nextId.Value - 1;
}
}
由于创建数据上下文和对SubmitChanges的调用之间的所有操作都是一个事务的一部分,我是否需要创建单独的数据上下文来检索下一个ID?每次我需要一个ID时,我需要查询和更新事务中的表,以防止多个应用程序获取相同的值。在GetNextId()方法中调用SubmitChanges()将提交以前所有操作,我不想这样做。
单独的数据上下文是唯一的方法,还是我可以尝试更好的东西?