2014-11-22 82 views
16

我想在實體框架中使用SQL Server sequence objects來顯示數字序列,然後將其保存到數據庫中。如何獲得實體框架中SQL Server序列的下一個值?

在目前的情況下,我正在做一些相關的存儲過程中增加了一個(以前的值存儲在一個表中)並將該值傳遞給C#代碼。

爲了達到這個目的,我需要一個表格,但現在我想將它轉換爲sequence對象(它會帶來什麼好處?)。

我知道如何創建序列並獲得SQL Server中的下一個值。

但我想知道如何獲得下一個值的sequence實體框架中的SQL Server對象?

我無法在SO中找到Related questions的有用答案。

在此先感謝。

+0

的可能的複製[如何獲得使用實體框架在SQL Server Express的下一個序列號?](http://stackoverflow.com/questions/16753149/how-to-get-the-next-sequence -number-in-sql-server-express-using-entity-framework) – 2016-01-23 19:41:28

回答

27

您可以創建在SQL Server中選擇這樣的一個序列值一個簡單的存儲過程:

CREATE PROCEDURE dbo.GetNextSequenceValue 
AS 
BEGIN 
    SELECT NEXT VALUE FOR dbo.TestSequence; 
END 

,然後可以導入存儲過程到實體框架的EDMX模型,並調用存儲程序和獲取這樣的序列:

// get your EF context 
using (YourEfContext ctx = new YourEfContext()) 
{ 
    // call the stored procedure function import 
    var results = ctx.GetNextSequenceValue(); 

    // from the results, get the first/single value 
    int? nextSequenceValue = results.Single(); 

    // display the value, or use it whichever way you need it 
    Console.WriteLine("Next sequence value is: {0}", nextSequenceValue.Value); 
} 

更新:實際上,你可以跳過存儲過程,只是從你的EF上下文中運行這個原始的SQL查詢:

public partial class YourEfContext : DbContext 
{ 
    .... (other EF stuff) ...... 

    // get your EF context 
    public int GetNextSequenceValue() 
    { 
     var rawQuery = Database.SqlQuery<int>("SELECT NEXT VALUE FOR dbo.TestSequence;"); 
     var task = rawQuery.SingleAsync(); 
     int nextVal = task.Result; 

     return nextVal; 
    } 
} 
+0

我該如何用代碼先做這件事? – 2016-04-14 14:50:22

+0

@TimPohlmann:只需運行「更新」部分中顯示的SQL語句 - 不需要存儲過程或任何需要的東西 – 2016-04-14 20:39:58

+0

但我必須先生成dbo。不是嗎? – 2016-04-18 06:53:33

0

如果你想做到這一點,你可以創建包含只是一個字符串或INT(無論你的程序返回),然後針對它運行的一些原始的SQL實體類的存儲過程之外。然後,只需使用你的對象或字符串,但是你想。

SEQ_TXN_ID txn_id= _context.SEQ_TXN_IDs.SqlQuery("SELECT txn_id_seq.NEXTVAL txn_ID FROM DUAL").FirstOrDefault(); 
+0

'FROM DUAL .... ....並不完全正確SQL Server/T -SQL語法... – 2017-11-01 12:25:49

+0

DUAL是一種ORACLE語法。 – 2017-11-03 22:45:20

相關問題