2014-11-22 8 views
16

Ich möchte SQL Server sequence objects in Entity Framework verwenden, um die Zahlensequenz vor dem Speichern in der Datenbank anzuzeigen.Wie erhält man den nächsten Wert der SQL Server-Sequenz in Entity Framework?

Im aktuellen Szenario mache ich etwas zusammenhängend um eins in der gespeicherten Prozedur (vorheriger Wert in einer Tabelle gespeichert) und übergibt diesen Wert an C# -Code.

Um dies zu erreichen, brauchte ich eine Tabelle, aber jetzt möchte ich es in ein sequence Objekt konvertieren (wird es irgendeinen Vorteil geben?).

Ich weiß, wie Sie Sequenz erstellen und nächsten Wert in SQL Server abrufen.

Aber ich möchte wissen, wie der nächste Wert von sequence Objekt von SQL Server in Entity Framework erhalten?

Ich bin nicht in der Lage, nützliche Antworten in Related questions in SO zu finden.

Vielen Dank im Voraus.

+0

Mögliches Duplikat [Wie die nächste Sequenznummer in SQL Server Express mit Entity Framework bekommen?] (Http://stackoverflow.com/questions/16753149/how-to-get-the-next-sequence -number-in-sql-server-express-using-entity-framework) –

Antwort

27

Sie können eine einfache gespeicherte Prozedur in SQL Server erstellen, die die nächste Sequenz Wert wie folgt wählt:

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

und dann können Sie importieren, die gespeicherte Prozedur in Ihr EDMX Modell in Entity Framework, und rufen Sie die gespeicherten den Sequenzwert wie dieses Verfahren und holen:

// 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); 
} 

Update: tatsächlich, können Sie die gespeicherte Prozedur überspringen und nur diese rohe SQL-Abfrage aus dem EF-Kontext ausführen:

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

Wie würde ich das zuerst mit Code machen? –

+0

@TimPohlmann: einfach die SQL-Anweisung ausführen, die ich im Abschnitt "Update" zeige - keine gespeicherte Prozedur oder irgendetwas benötigt –

+0

Aber ich muss zuerst dbo generieren. Nicht wahr? –

0

Wenn Sie wollten es außerhalb einer gespeicherten Prozedur tun können Sie eine Entität Klasse erstellen, die (was auch immer Ihre Sequenz zurückgibt) und führen Sie dann einige rohe SQL dagegen nur einen String oder int hält. Dann benutze einfach dein Objekt oder deine Zeichenfolge, wie du es möchtest.

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

'FROM DUAL' .... ist nicht genau richtig SQL Server/T -SQL-Syntax ... –

+0

DUAL ist eine ORACLE-Syntax. –

Verwandte Themen