2017-06-27 4 views
0

Ich habe einige Schwierigkeiten mit der folgenden Ausnahme: "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt."C# entity-framework Objekt Referenz Ausnahme

-Code-First Migration bei EntityFramework MVC5

public class Driver 
{ 
    [Key] 
    public int NumberId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Age { get; set; } 

    public string TeamName { get; set; } 
    public Team Team { get; set; } 

} 

die Konfiguration:

namespace f1app.Migrations.F1app 
{ 
    using Data; 
    using System; 
    using System.Data.Entity; 
    using System.Data.Entity.Migrations; 
    using System.Linq; 

    internal sealed class Configuration : DbMigrationsConfiguration<f1app.Data.F1appContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = false; 
      MigrationsDirectory = @"Migrations\F1app"; 
     } 

     protected override void Seed(f1app.Data.F1appContext context) 
     { 

      context.Teams.AddOrUpdate(
       t => t.TeamName, DummyData.getTeams().ToArray()); 
      context.SaveChanges(); 

      context.Drivers.AddOrUpdate(
       d => new { d.FirstName, d.LastName }, DummyData.getDrivers(context).ToArray()); 
     } 
    } 
} 

und das Initial erstellen:

namespace f1app.Migrations.F1app 
{ 
    using System; 
    using System.Data.Entity.Migrations; 

    public partial class InitialCreate : DbMigration 
    { 
     public override void Up() 
     { 
      CreateTable(
       "dbo.Drivers", 
       c => new 
        { 
         NumberId = c.Int(nullable: false, identity: true), 
         FirstName = c.String(), 
         LastName = c.String(), 
         Age = c.String(), 
         TeamName = c.String(maxLength: 30), 
        }) 
       .PrimaryKey(t => t.NumberId) 
       .ForeignKey("dbo.Teams", t => t.TeamName) 
       .Index(t => t.TeamName); 

      CreateTable(
       "dbo.Teams", 
       c => new 
        { 
         TeamName = c.String(nullable: false, maxLength: 30), 
         City = c.String(), 
         Founded = c.String(), 
        }) 
       .PrimaryKey(t => t.TeamName); 

     } 

     public override void Down() 
     { 
      DropForeignKey("dbo.Drivers", "TeamName", "dbo.Teams"); 
      DropIndex("dbo.Drivers", new[] { "TeamName" }); 
      DropTable("dbo.Teams"); 
      DropTable("dbo.Drivers"); 
     } 
    } 
} 

als einige Dummy-Daten für die Fahrer erhalten zu bekommen in die Tabelle ....

public static List<Driver> getDrivers(F1appContext context) 
{ 
    List<Driver> drivers = new List<Driver>(){ 
     new Driver{ 
      NumberId=5, 
      FirstName="Sebastian", 
      LastName="Vettel", 
      Age="29", 
      TeamName=context.Teams.Find("Ferrari").TeamName, 
     }, 
     new Driver{ 
      NumberId=44, 
      FirstName="Lewis", 
      LastName="Hamilton", 
      Age="32", 
      TeamName= context.Teams.Find("Mercedes").TeamName 
     }, 
     new Driver{ 
      NumberId=19, 
      FirstName="Felipe", 
      LastName="Massa", 
      Age="36", 
      TeamName=context.Teams.Find("Williams").TeamName 
     } 
    }; 
    return drivers; 
} 

und die PM-Konsole für das Update verwenden - update-database -ConfigurationTypeName f1app.Migrations.F1app.Configuration. Aber nur die Tabelle für die Teams funktioniert gut, die Drivers Table bekommt keine Daten .... Irgendeine Idee warum?

+0

Erste Schätzung würde sein, dass die 'context.Teams.Find (" Ferrari ") .TeamName' Zeilen fehlschlagen, da die' Find' keine Daten zurückgibt. Gibt es Teams mit diesen Schlüsseln im Kontext? Könnten Sie auch Ihren Code für 'DummyData.getTeams()' – Thewads

+0

hinzufügen? Ihr 'getTeams' Code fehlt. – tschmit007

+0

Ihr 'TeamName = context.Teams.Find (" Williams "). TeamName' ist seltsam. 'TeamName =" Williams "' sollte genug sein – tschmit007

Antwort

1

haben Sie einen missplaced

context.SaveChanges(); 

das ist:

protected override void Seed(f1app.Data.F1appContext context) 
    { 

     context.Teams.AddOrUpdate(
      t => t.TeamName, DummyData.getTeams().ToArray()); 
     context.SaveChanges(); // <---------------------- 

     context.Drivers.AddOrUpdate(
      d => new { d.FirstName, d.LastName }, DummyData.getDrivers(context).ToArray()); 
     //should be here: 
     context.SaveChanges(); // <---------------------- 
    } 

man genug ist. Ich lasse beide zur Veranschaulichung.

+0

Sorry, ich habe versucht, aber nichts hat sich wirklich geändert, immer noch die gleichen Fehler-Ausnahmen nach dem Ausführen der Paket-Manager-Konsole Befehl - Objektreferenz nicht auf eine Instanz eines Objekts gesetzt. –

+0

das ist das Ende der msg bekomme ich von der PM-Konsole nach dem Ausführen der Update-Befehl: ..... bei System.Data.Entity.Migrations.Design.ToolingFacade.Update (String targetMigration, Boolean Force) bei System.Data .Entity.Migrations.UpdateDatabaseCommand. <> C__DisplayClass2. <.ctor> b__0() bei System.Data.Entity.Migrations.MigrationsDomainCommand.Execute (Befehl Aktion) Objektreferenz nicht auf eine Instanz eines Objekts festgelegt. –

+0

Ich denke, das Problem ist irgendwie mit den Referenzen oder etwas verbunden .... nicht wissen - versuchen zu verstehen, wie die C# und .net MVC gerade arbeiten .... –

Verwandte Themen