一千萬個為什麽

搜索

生成非身份主鍵

我的工作區不使用主鍵的標識列或GUID。相反,我們根據需要從表中檢索“下一個ID”,並為每個插入增加值。

不幸的是,LINQ-TO-SQL似乎圍繞使用標識列進行了優化。因此,每當我執行插入操作時,我都需要查詢和更新“NextId”表。為簡單起見,我在創建新對象時執行此操作:

var db = new DataContext( "...connection string..." );
var car = Car
{
    Id = GetNextId( db ),
    TopSpeed = 88.0
};
db.InsertOnSubmit( car );
db.SubmitChanges();

GetNextId方法是這樣的:

public int GetNextId( DataContext db )
{
    using ( var transaction = new TransactionScope ( TransactionScopeOption.RequiresNew ) )
    {
        var nextId = (from n in db.GetTable ()
                      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()將提交所有以前的操作,我不想這樣做。

單獨的數據上下文是唯一的方法,還是我可以嘗試更好的東西?

最佳答案

暫時沒有最佳答案

轉載註明原文: 生成非身份主鍵