2015-05-10 11 views
5

używam ASP.NET MVC 5 z Entity Framework 6. Mam tabeli tak:Przenoszenie pozycji do listy przedmiotów w migracji Entity Framework

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

    //...rest 
} 

Teraz chcę, aby przesunąć Food do listy żywności. Tak:

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

    //... rest 
} 

Gdybym spróbować i dodać migrację, stracę dane związane z Food IDS. I nie będzie wiedział, który przepis jest na jedzenie.

Próbowałem zachowując Food i dodać listę tak:

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

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

    //... rest 
} 

Ale migracja dodaje drugi klucz obcy i nie aktualizować. Oto kod, który nie migracja:

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

Jak mogę przesunąć pojedynczy Food do listy Food s bez utraty aktualnych danych w tabeli?

+0

Jaki był pierwotny związek między 'Recipes' i' Foods'? Wygląda na to, że próbujesz przejść z jednego do jednego (gdzie klucz obcy znajduje się w tabeli "Przepisy") na jeden do wielu (gdzie klucz obcy znajduje się w tabeli "Żywność")? – jjj

Odpowiedz

4

Po utworzeniu musisz dostosować swoją migrację.

  1. zmodyfikować klasy podmiot

    public class Recipe 
    { 
        public virtual IList<Food> Foods { get; set; } 
    
        //... rest 
    } 
    
  2. Korzystając Add-Migration do rusztowania migrację

  3. Modyfikacja wygenerowanego migrację wypełnić nową kolumnę z danymi. Będziesz chciał wypełnić nową kolumnę Recipe_Id w Foods za pomocą identyfikatorów wcześniej powiązanych wierszy.

    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

Wielkie dzięki. Pracował bez zarzutu. Tylko korekta: 'WHERE Foods.ID = r.Food_ID' w instrukcji' UPDATE'. –

Powiązane problemy