2015-05-10 1 views
5

ich Asp.Net MVC 5 mit Entity Framework bin mit 6. Ich habe eine Tabelle wie folgt bekommen:Artikel Verschieben der Elemente in einer Entity Framework Migration zur Liste

public class Recipe 
{ 
    [Required] 
    public virtual Food Food { get; set; } 

    //...rest 
} 

Jetzt will ich die bewegen Food zu einer Liste von Lebensmitteln. Wie folgt aus:

public class Recipe 
{ 
    public virtual IList<Food> Foods { get; set; } 

    //... rest 
} 

Wenn ich dies versuchen und eine Migration hinzufügen, werde ich die Daten verlieren Food Ids zusammen. Und wird nicht wissen, welches Rezept für welches Essen ist.

Ich versuchte, die Food und fügen Sie die Liste wie folgt zu halten:

public class Recipe 
{ 
    [Required] 
    public virtual Food Food { get; set; } 

    public virtual IList<Food> Foods { get; set; } 

    //... rest 
} 

Aber die Migration fügt einen zweiten Fremdschlüssel und aktualisiert fehlschlägt. Hier ist die Migration Code, der fehlschlägt:

public override void Up() 
    { 
     DropForeignKey("dbo.Recipes", "Food_ID", "dbo.Foods"); 
     DropIndex("dbo.Recipes", new[] { "Food_ID" }); 
     AddColumn("dbo.Foods", "Recipe_Id", c => c.Int()); 
     AddColumn("dbo.Foods", "Recipe_Id1", c => c.Int()); 
     AlterColumn("dbo.Recipes", "Food_ID", c => c.Int()); 
     CreateIndex("dbo.Foods", "Recipe_Id"); 
     CreateIndex("dbo.Foods", "Recipe_Id1"); 
     CreateIndex("dbo.Recipes", "Food_ID"); 
     AddForeignKey("dbo.Foods", "Recipe_Id", "dbo.Recipes", "Id"); 
     AddForeignKey("dbo.Foods", "Recipe_Id1", "dbo.Recipes", "Id"); 
     AddForeignKey("dbo.Recipes", "Food_ID", "dbo.Foods", "ID"); 
    } 

Wie kann ich die einzelnen Food auf eine Liste von Food s bewegen, ohne die aktuellen Daten in der Tabelle zu verlieren?

+0

Was war die ursprüngliche Beziehung zwischen 'Recipes' und' Foods'? Sieht so aus, als ob Sie versuchen, von einer Eins-zu-eins-Tabelle (wo der Fremdschlüssel in der Tabelle "Rezepte" ist) zu Eins-zu-Vielen zu wechseln (wo der Fremdschlüssel in der Tabelle "Lebensmittel" ist)? – jjj

Antwort

4

Sie müssen die Migration nach dem Erstellen anpassen.

  1. Ändern Sie bitte Ihre Entitätsklasse

    public class Recipe 
    { 
        public virtual IList<Food> Foods { get; set; } 
    
        //... rest 
    } 
    
  2. Verwenden Add-Migration die Migration

  3. Ändern Sie die erzeugte Migration Gerüst die neue Spalte mit Daten zu füllen. Sie möchten die neue Recipe_Id-Spalte in Foods mit den IDs der zuvor verwandten Zeilen füllen.

    public override void Up() 
    { 
        DropForeignKey("dbo.Recipes", "Food_ID", "dbo.Foods"); 
        DropIndex("dbo.Recipes", new[] { "Food_ID" }); 
        AddColumn("dbo.Foods", "Recipe_Id", c => c.Int()); 
    
        // Update values from existing data, not sure if the syntax is perfect 
        Sql(@"UPDATE dbo.Foods SET Recipe_Id = r.Id 
          FROM (SELECT Id, Food_ID FROM dbo.Recipes) AS r 
          WHERE Foods.ID = r.Food_ID"); 
    
        DropColumn("dbo.Recipes", "Food_ID"); 
        CreateIndex("dbo.Foods", "Recipe_Id"); 
        AddForeignKey("dbo.Foods", "Recipe_Id", "dbo.Recipes", "Id"); 
    } 
    
+0

Vielen Dank. Einwandfrei gearbeitet. Nur Korrektur: 'WHERE Foods.ID = r.Food_ID' in Ihrer 'UPDATE'-Anweisung. –

Verwandte Themen