2010-03-15 82 views
1

使用下列內容:找回新插入的記錄ID與LINQ to SQL的

private BlogDataContext db = new BlogDataContext(); 

article.Created = DateTime.UtcNow; 
article.Modified = DateTime.UtcNow; 

db.Articles.InsertOnSubmit(article); 
db.SubmitChanges(); 

int id = article.Id; 

我想知道這是安全的嗎?它會給我用戶剛剛插入的文章的Id,或者如果另一個用戶在該用戶之後更新文章幾分之一秒,是否會出現併發情況?

回答

4

您的dataContext實例(名爲db)將捕獲插入時由數據庫生成的標識值。如果另一個用戶在該點之後修改該值,那麼不僅會看不到它,而且DataContext實例在被問到時會給你現在的陳舊值!如果您考慮DataContext必須如何爲數據修改執行對象跟蹤,這纔有意義。

如果你正在嘗試添加父記錄,然後在「安全」(原子)的方式添加子記錄,而是執行此操作:

Order o1 = new Order() {Date = DateTime.Now, Quantity = 3}; 
Order o2 = new Order() {Date = DateTime.Now, Quantity = 4}; 

Customer c1 = new Customer() {Name = "Bob"}; 
c1.Orders.Add(o1); 
c1.Orders.Add(o2); 

db.InsertOnSubmit(c1); 
db.SubmitChanges(); 

客戶和訂單都將被插入到數據庫 - 全部或沒有(如果沒有,你會得到一個異常告訴你爲什麼)。

請注意,我使用關係屬性:Customer.Orders而不是使用Id。這是因爲我不知道數據庫會生成什麼ID。 DataContext也不知道。但是,如果您檢查Customer.Orders自動生成的代碼 - 您將看到該ID在那裏管理。

+0

男人,非常感謝你的答案是正確的,我通常會插入你的建議,但在這裏我有一個動態系統,並會有插件,所以這個想法是插件動態插入Cpanel,然後當用戶插入記錄我保存在會話中插入的ID,並使用它插件插入他們的數據到各自的DBS。 我希望有更好的辦法 – DevMania 2010-03-16 06:39:43