![](/img/trans.png)
[英]How to insert primary key from one table which created by auto increment, into a second table as forign key?
[英]How to get the primary key from a table without making a second trip?
如何在不進行LINQ To SQL數據庫的第二次訪問的情況下從表中獲取主鍵ID號?
現在,我將數據提交到一個表中,並再次進行一次旅行,以確定為新字段分配的id(在自動增量id字段中)。 我想在LINQ To SQL中執行此操作,而不是在Raw SQL中執行此操作(我不再使用Raw SQL)。
此外,我的問題的第二部分是:我總是小心地知道在線用戶的ID,因為我寧願使用他們的ID在各種表中調用他們的信息,而不是使用GUID或用戶名,這些都是長的字符串。 我之所以這樣做是因為我認為進行數字比較的SQL Server比使用用戶名(字符串)甚至是guid(非常長的字符串)比較更有效(?)。 我的問題是,我是否比我應該更關心? 差異值是否總是將userid(int32)保持在會話狀態?
@RedFilter為第一個問題提供了一些有趣/有希望的線索,因為我在這個階段無法嘗試它們,如果有人知道或可以確認他在答案的評論部分建議的這些變化?
如果您有對該對象的引用,則可以在調用db.SubmitChanges()
之后使用該引用並調用主鍵。 LINQ對象將自動更新其(標識符)主鍵字段,以反映通過SQL Server分配給它的新主鍵字段。
示例(vb.net):
Dim db As New NorthwindDataContext
Dim prod As New Product
prod.ProductName = "cheese!"
db.Products.InsertOnSubmit(prod)
db.SubmitChanges()
MessageBox.Show(prod.ProductID)
您可以在函數中包含上面的代碼並返回ProductID(或等效的主鍵)並在其他地方使用它。
編輯:如果您沒有進行原子更新,您可以將每個新產品添加到單獨的集合中,並在調用SubmitChanges后迭代它。 我希望LINQ像數據集一樣提供“數據庫偷看”。
除非您正在做一些與眾不同的事情,否則您不需要做任何額外的事情來檢索生成的主鍵。
在Linq-to-SQL datacontext上調用SubmitChanges
時,它會自動更新對象的主鍵值。
關於你的第二個問題 - 通過對數字字段進行掃描而不是像varchar()那樣,可能會有很小的性能提升,但是通過確保數據庫中的正確列被索引,您將看到更好的性能。 並且,對於SQL Server,如果使用標識列創建主鍵,則默認情況下它將具有聚簇索引。
Linq to SQL使用插入新記錄時生成的ID自動設置類的標識值。 只需進入酒店。 我不知道它是否使用了單獨的查詢,從未使用它,但ORM需要另一個查詢來取回最后插入的ID並不罕見。
有兩種方法可以獨立於Linq To SQL(可以使用它):
1)如果您使用的是SQL Server 2005或更高版本,則可以使用OUTPUT子句:
返回受INSERT,UPDATE或DELETE語句影響的每一行的信息或基於表達式的表達式。 這些結果可以返回到處理應用程序,以用於確認消息,存檔和其他此類應用程序要求。 或者,可以將結果插入表或表變量中。
2)或者,您可以構造一個這樣的批處理INSERT語句:
insert into MyTable
(field1)
values
('xxx');
select scope_identity();
它至少可以用於SQL Server 2000。
在T-SQL中,您可以使用OUTPUT子句,說:
INSERT table (columns...)
OUTPUT inserted.ID
SELECT columns...
因此,如果您可以將LINQ配置為使用該構造進行插入,那么您可以輕松地將其恢復。 但是,LINQ是否可以從插入中獲取值,我會讓其他人回答這個問題。
從LINQ調用存儲過程返回ID作為輸出參數可能是最簡單的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.