EF Datenbank Migration: Daten einfügen und IDs bekommen

Ich stand vor dem Problem, dass ich bei einer Migration Daten in eine schon vorhandene und mit Daten befüllte Tabelle einfügen musste. Über Seed Daten war es nicht möglich, daher wollte ich das in der Migration machen. Bei einfachen Daten geht das auch mit migrationBuilder.InsertData aber nicht, wenn man einen Datensatz einfügen und mit dessen ID dann weitere abhängige Daten eintragen möchte.

Ein einfaches Beispiel: ich habe User und Groups und möchte nun in meiner Migration eine neue Gruppe und einen User in dieser Gruppe anlegen. Mein erster Gedanke scheiterte:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.InsertData(
        table: "Group",
        columns: new[] { "Name" },
        values: new object[] { "The Groupname" }
    );

    // hier ist das problem - wie bekomme ich die groupId ? 
    migrationBuilder.InsertData(
        table: "User",
        columns: new[] { "Username", "GroupId" },
        values: new object[] { "specialuser", "???" }
    );  
}

Wie immer war Stackoverflow sehr hilfreich, offenbar muss man das über direkte SQL machen, was ja mit migrationBuilder.Sql() funktioniert:

var commandText = @"
    DECLARE @groupId int
    INSERT INTO Group (Name) VALUES ('Groupname')
    SELECT @groupId = SCOPE_IDENTITY()
    INSERT INTO [User] (Username, GroupId) VALUES ('specialuser', @groupId)";
migrationBuilder.Sql(commandText);

Und damit funktioniert es!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.