2017-08-24 43 views
1

我有這樣使用EF在oracle中獲取插入ID的最佳方式是什麼?

myEntity.Database.ExecuteSqlCommand("insert into mytable (id, name) values (mytable_SEQ.nextval,'John')") 

mytable_SEQ查詢是創建生成MYTABLE

什麼是讓插入的ID的最佳方式唯一的ID序列?

+0

我不認爲這與EF有關。你可以引入** OUT **參數並使用Oracle SQL ['RETURNING'](https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm)子句 –

+0

@IvanStoev是的,這是一個選項也是如此。而且,您還需要權衡使用存儲過程引入的額外複雜性。再加上它可能需要維護的代碼,哪些不在C#應用程序的圖層中。 – kayess

+1

雖然它不需要是SP。它可能是匿名的PL/SQL塊,例如像'ExecuteSqlCommand(「開始插入到...返回ID到p_Id;結束;」,outParameter);' –

回答

1

有沒有這樣的事情最好的辦法。有幾種方法可以實現你想要的。基本上首先是執行sequence.CURRVAL來獲取序列的當前值。您也可以使用MAX(id)進行查詢以獲取ID列的最大值。

注意:如果您具有併發性,這兩種方法都不安全。另一個線程可能會修改序列或向表中插入新記錄。

爲了反映您的評論,我知道的唯一事情是在插入行時使用悲觀鎖定,並在同一事務中選擇最大ID。

+0

我打算說同樣的事情。沒有其他可靠的解決方案? –

+0

在sql server中你可以添加OUPUT INSERTED.ID並獲取你的ID,太遺憾了在oracle中沒有這樣的東西。沒有提到添加簡單標識列的複雜性。 –

+0

我會採取你的解決方案,因爲我的應用程序不會有任何併發​​性,因爲我沒有太多的客戶端,我的應用程序,我有辦法檢查它是否是正確的記錄後,插入.. –

0

我知道這是絕對不正確的方式,這是我怎麼沒迄今:

int nextid = myEntity.Database.SqlQuery<int>("select mytable_SEQ.nextval from dual").FirstOrDefault(); 

然後

myEntity.Database.ExecuteSqlCommand("insert into mytable (id, name) values ("+nextid+",'John')") 

我知道它可以以某種方式在一個查詢完成..

相關問題