Wie erhalte ich den nächsten Wert der SQL Server-Sequenz in Entity Framework?

c# entity-framework orm sql-server sql-server-2012

Frage

Ich möchte SQL Server- sequence in Entity Framework verwenden, um die Nummernfolge anzuzeigen, bevor sie in der Datenbank gespeichert werden.

Im aktuellen Szenario mache ich etwas, das in der gespeicherten Prozedur um eins erhöht wird (vorheriger Wert in einer Tabelle gespeichert) und diesen Wert an C # -Code übergeben.

Um dies zu erreichen, brauchte ich eine Tabelle, aber jetzt möchte ich sie in ein sequence konvertieren (gibt es einen Vorteil?).

Ich weiß, wie man eine Sequenz erstellt und einen nächsten Wert in SQL Server erhält.

Ich möchte jedoch wissen, wie der nächste Wert des sequence von SQL Server in Entity Framework abgerufen wird.

Ich finde keine nützlichen Antworten in verwandten Fragen in SO.

Danke im Voraus.

Akzeptierte Antwort

Sie können eine einfache gespeicherte Prozedur in SQL Server erstellen, die den nächsten Sequenzwert wie folgt auswählt:

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

Anschließend können Sie diese gespeicherte Prozedur in Ihr EDMX-Modell in Entity Framework importieren und diese gespeicherte Prozedur aufrufen und den Sequenzwert wie folgt abrufen:

// 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: Sie können die gespeicherte Prozedur eigentlich überspringen und diese unformatierte SQL-Abfrage einfach aus Ihrem 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;
    }
}

Beliebte Antwort

Da ich Code First verwende und keine zusätzliche DDL haben möchte, ist dies mein Weg: (EF Core 2.1, SQL Server)

Definieren Sie die Reihenfolge:

protected override void OnModelCreating( ModelBuilder modelBuilder )
{
    modelBuilder.HasSequence("MySequence");
}

Und um es abzurufen, füge ich dem Kontext die folgende Funktion hinzu:

public int GetMySequence()
{
   SqlParameter result = new SqlParameter("@result", System.Data.SqlDbType.Int)
   {
      Direction = System.Data.ParameterDirection.Output
   };

   Database.ExecuteSqlCommand(
              "SELECT @result = (NEXT VALUE FOR MySequence)", result);

   return (int)result.Value;
}


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum