生成非身份主键

时间:2010-04-16 15:00:11

标签: linq-to-sql primary-key

我的工作区不使用主键的标识列或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()将提交以前所有操作,我不想这样做。

单独的数据上下文是唯一的方法,还是我可以尝试更好的东西?

0 个答案:

没有答案