2016-04-08 4 views
0

Der Versuch, eine Ansicht für "Create" mit Hilfe des NavBar-Modells und der NavBarEntity (unten in MVC6) zu erstellen, empfängt diese Nachricht ...MVC 6 Create View-Probleme: Beim Erstellen des DBContext ist ein Fehler aufgetreten.

enter image description here

Es gab einen Fehler des ausgewählten Codegenerator ausgeführt wird: Es ist ein Fehler aufgetreten, die DBVContext Instanz das Modell zu bekommen ... der Wert darf nicht null sein ... Parameter Name: connection

I wählte diesen Modus im View Wizard ...

public class NavBarModel 
{ 
    public string ID { get; set; } 
    public List<LinkModel> Links { get; set; } 
} 

Diese DbContext Klasse hier ...

public class NavBarEntity : DbContext 
    { 
     public NavBarEntity() 
     { 
      ID = Guid.NewGuid().ToString(); 
     } 
     [Key] 
     public string ID { get; set; } 
     public DbSet<List<LinkModel>> Links { get; set; } 
    } 

Und die LinkModel hier .. gezeigt

public class LinkModel 
{ 
    public LinkModel() 
    { 
     ID = Guid.NewGuid().ToString(); 
    } 
    [Key] 
    private string ID { get; set; } 
    public string HREF { get; set; } 
    public string Text { get; set; } 
} 

Configure Services wie folgt aussieht ...

 var cfg2 = Configuration["Data Source=MyPC\\SQLEXPRESS;Initial Catalog=Dashboard;Integrated Security=True;Pooling=False"]; 
     services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<ApplicationDbContext>(options => 
       options.UseSqlServer(cfg)) 
      .AddDbContext<NavBarEntity>(options => 
      { 
       options.UseSqlServer(cfg2); 
      }); 
gezeigt

Frage: Was mache ich falsch?

Antwort

0

Danke für die Hilfe oben aufgeführten ..

Für Neulinge MVC6 und EF7, die Methode mit dem Namen ConfigureServices, muss eine json Zeiger auf die enthalten appsetting.json. Diese Methode befindet sich in der Datei Startup.cs.

Dies ist die Dienstkonfiguration, die dem oben gezeigten Code entspricht. Der String-Wert in den Klammern zeigt auf den JSON-Platz ...

 var cfg2 = Configuration["Data:DashboardContext:ConnectionString"]; 
     services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<DashboardContext>(options => 
      { 
       options.UseSqlServer(cfg2); 
      }) 

Aber Sie müssen auch einen Wert in Appsettings eingeben.json wie folgt aus:

"Data": { 
    "DefaultConnection": { 
     "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnet5-TestWebApplication1-d91c23e4-3565-476d-a7c0-45665bc0c367;Trusted_Connection=True;MultipleActiveResultSets=true" 
    }, 
    "DashboardContext": { 
     "ConnectionString": "Data Source= MYPC\\SQLEXPRESS;Initial Catalog=Dashboard;Integrated Security=True;Pooling=False" 
     } 
    }, 

Die Ursache des Parameter Name: connection null zu sein, war, dass die appsettings.json genau wie oben gezeigt sein muss. Die JSON-Parsing-Routinen müssen in der Lage sein, das String-Name/Wert-Paar zu finden ... Beachten Sie, dass diese Konfigurationen unter dem Namen "Data" fallen, der andere Namen enthält. In diesem Fall war standardmäßig "DefaultConnection" vorhanden, und ich habe den "DashboardContext" -Teil hinzugefügt.

auch 6 in MVC müssen Sie den Connectiontyp IServiceProvider und NICHT Zeichenfolge ändern, wie vor ...

public class DashboardContext : DbContext 
{ 
    public DashboardContext(IServiceProvider connectionString) : base (connectionString) 
    {} 
    public DbSet<NavBarEntity> NavBars { get; set; } 
} 

Alas Geographie: Die Ansichten kein Problem geschaffen ... Ja!

The Views

+1

Die Zeichenfolge im Konstruktor zu EF6 gilt, die ich angenommen hatte, was Sie wurden unter Verwendung von (I MVC6 als EF6 falsch verstanden :-) ich die EF7 Version auf meine Antwort auf Vollständigkeit hinzugefügt haben. Die anderen Bits über die Entität, die nicht von DbContext erbt, gelten weiterhin, obwohl dies offensichtlich nicht die Ursache Ihres Problems war. – lawst

+0

@lawst Dank ein Haufen für deine Hilfe hat es mich quadriert ... –

1

Die Art, wie Sie versucht haben, den DbContext und Ihre Entität zu kombinieren, ist nicht richtig. Der DbContext sollte auf alle Entitäten verweisen, die Sie als DbSets haben - Entitäten sollten nicht von ihnen erben.

Ihre DbContext sollte auf diese (EF6) ähnlich aussehen

public class MyDbContext : DbContext 
{ 
    public MyDbContext(string connectionString) 
     : base(connectionString) 
    { } 

    public DbSet<NavBarEntity> NavBars { get; set; } 
    // Other entities 
} 

Der Konstruktor nimmt den Namen des Strings Eintrag verbinden, die in Ihrer web.config definiert ist Sie verwenden möchten. Es gibt auch andere Möglichkeiten, dies aber zu tun - here

Dann erstellen Sie Ihre Entitäten als eine einfache Klasse (POCO) sehen:

public class NavBarEntity 
{ 
    public NavBarEntity() 
    { 
     ID = Guid.NewGuid().ToString(); 
    } 

    [Key] 
    public string ID { get; set; } 

    // Other properties/columns here 
} 

EDIT

Meine ursprüngliche Antwort auf EF6 beruhte statt EF7. Hier ist, wie ich den Kontext, in EF7 auf Vollständigkeit implementieren würde:

public class MyDbContext : DbContext 
{ 
    public MyDbContext(DbContextOptions<MyDbContext> options) 
     : base(options) 
    { } 

    public DbSet<NavBarEntity> NavBars { get; set; } 
    // Other entities 
} 
Verwandte Themen