Der ExecuteSqlCommand Methode können Parameter einer SQL-Abfrage auf 3 verschiedene Arten übergeben werden. Folgende Beispiele zeigen immer das Einfügen in eine Tabelle mit Identity-Spalte und das anschliessense Auslesen des Identity-Werts.

Variante 1: Benannte SqlParameter

var nameSqlParam = new SqlParameter("@UserName", SqlDbType.NVarChar, 64);
nameSqlParam.Value = "TestUser 1";
var idSqlParam = new SqlParameter("@Id", SqlDbType.Int)
idSqlParam.Direction = ParameterDirection.Output;
ctx.Database.ExecuteSqlCommand(
  "INSERT INTO [User] (Name) VALUES (@UserName); SET @Id = SCOPE_IDENTITY();",
  nameSqlParam, idSqlParam);

Die SqlParameter müssen hier genau gleich heissen wie in der SQL-Abfrage. Die Reihenfolge wie die Parameter in der ExecuteSqlCommand Methode übergeben werden spielt hier keine Rolle.

Variante 2: Platzhalter für SqlParameter

ctx.Database.ExecuteSqlCommand(
  "INSERT INTO [User] (Name) VALUES ({0}); SET {1} = SCOPE_IDENTITY();",
  nameSqlParam, idSqlParam);

Die Platzhalter in der SQL-Abfrage müssen mit {0} beginnen und lückenlos aufsteigend nummeriert sein. Die Reihenfolge wie die SqlParameter in der ExecuteSqlCommand Methode übergeben werden spielt keine Rolle.

Variante 3: FormattableString

string nameString = "TestUser 2";
ctx.Database.ExecuteSqlCommand(
  $@"INSERT INTO [User] (Name) VALUES ({nameString});
  SET {idSqlParam} = SCOPE_IDENTITY();");

Die Parameter werden hier mittels String-Interpolation direkt in den FormattableString eingefügt (man beachte das $ am Anfang). Es können primitive Datentypen oder SqlParameter angegeben werden. Wichtig: SqlParameter müssen zwingend einen Namen haben der mit @ beginnt!