2016-04-02 10 views
1

Ich benutze Entity Framework 6.1.3 Code zuerst zu einer vorhandenen Datenbank zuordnen. Ich habe viele Fragen über diesen Fehler gegoogelt, jedoch alle Fehler, die mit der Vererbung zusammenhängen, aber ich habe die Vererbung nicht benutzt. Ich habe versucht, meine Datenbank zu löschen und alle Tabellen neu zu erstellen, aber der Fehler ist nicht verschwunden.Ungültiger Spaltenname 'Schedule_IdSchedule'. Keine Vererbung und es gibt keine solche Spalte in DB. One-to-Many

Ich habe wirklich einfache Datenbank nur mit zwei Tabellen - Schedules und Seances:

CREATE TABLE [dbo].[Schedules] (
    [IdSchedule] INT   IDENTITY (1, 1) NOT NULL, 
    [Cinema]  VARCHAR (50) NULL, 
    [Movie]  VARCHAR (50) NULL, 
    [DateSchedule] DATETIME  NULL, 
    [IdSeance]  INT   NOT NULL, 
    PRIMARY KEY CLUSTERED ([IdSchedule] ASC) 
); 

und:

CREATE TABLE [dbo].[Seances] (
    [IdSeance] INT  IDENTITY (1, 1) NOT NULL, 
    [DateSeance] DATETIME NOT NULL, 
    PRIMARY KEY CLUSTERED ([IdSeance] ASC) 
); 

und Modellklassen:

public class Schedule 
{ 
    [Key] 
    public int IdSchedule { get; set; } 
    public string Cinema { get; set; } 
    public string Movie { get; set; } 
    public DateTime DateSchedule { get; set; } 
    public List<Seance> Seances { get; set; } 
} 

public class Seance 
{ 
    [Key] 
    public int IdSeance { get; set; } 
    public DateTime DateSeance { get; set; } 
} 

und EFDBContext Klasse:

public class EFDbContext : DbContext 
{ 
    public EFDbContext() 
    { 
     Database.SetInitializer<EFDbContext>(null); 
    } 
    public DbSet<Schedule> Schedules { get; set; } 
    public DbSet<Seance> Seances { get; set; } 
} 

Allerdings, wenn ich versuche, diese Zeilen von Code auszuführen:

var e1= EFDbContext.Schedules.ToList();//it works okay 
var e2 = EFDbContext.Seances.ToList();// An exception occurs 

In der zweiten Reihe eine Ausnahme auftritt: "Ungültiger Spaltenname 'Schedule_IdSchedule'"

}-System .Exception {System.Data.SqlClient.SqlException}

Die interessanteste Sache, die ich Spaltenname nichthaben. Wohin nimmt Entity Framework diese Spalte? Wie kann ich es lösen?

Antwort

1

Wenn Sie unerwünschte Spalten im Muster von "table_fkcolumn" sehen, bedeutet das, dass EF das darin stecken bleibt, weil es Ihr Modell nicht interpretieren konnte. Wenn Sie einen Zeitplan für viele Seancen wollen, versuchen Sie dies:

public class Schedule 
{ 
    public Schedule() 
    { 
     Seances = new List<Seance>(); 
    } 

    [Key] 
    public int IdSchedule { get; set; } 
    public string Cinema { get; set; } 
    public string Movie { get; set; } 
    public DateTime DateSchedule { get; set; } 
    public virtual ICollection<Seance> Seances { get; set; } 
} 

public class Seance 
{ 
    [Key] 
    public int IdSeance { get; set; } 
    public DateTime DateSeance { get; set; } 
    public int IdSchedule { get; set; } 

    [ForeignKey("IdSchedule")] 
    public virtual Schedule Schedule{ get; set; } 
} 

Alternativ können Sie auch eine flüssige Konfiguration verwenden, in dem Fall, dass Sie die Anmerkungen entfernen und außer Kraft setzen OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{    
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

    modelBuilder.Entity<Schedule>() 
     .HasMany(u => u.Seances) 
     .WithRequired() 
     .HasForeignKey(h => h.IdSchedule);   
} 
+0

Was bedeutet '{Seances = new List (); } 'bedeuten in' Schedule' Klasse? Mein Kompilator weiß nichts über diese Konstruktion. – StepUp

+0

Sorry, fehlender Konstruktor Teil. Bearbeitet. –

+0

Danke, ich habe Ihren Code ausprobiert, jedoch habe ich eine weitere Ausnahme: ** "Ungültiger Spaltenname" IdSchedule '**. Vielleicht haben Sie noch andere Voraussetzungen? – StepUp

0

Ich glaube, Sie haben Ihre Tabelle aus dem Zeitplan in Zeitpläne umbenannt. versuchen Sie, Ihren dbcontext zu aktualisieren. davon funktioniert immer noch nicht, löschen Sie Tabelle Zeitplan aus Ihrem dbcontext-Schema und lasen es. es wird klappen.

+0

1. Wie kann ich 'DBContext' aktualisieren? Bitte Code anzeigen 2. Wie kann ich die Tabelle 'Schedule' aus' DBContext' löschen? Zeigen Sie bitte Code – StepUp

+0

öffnen Sie das dbcontext-Schema und klicken Sie mit der rechten Maustaste auf die betreffende Tabelle, die Sie löschen finden. Als ein weiterer Klick rechts und wählen Sie Aktualisieren dbcontext, um Sie Tabelle – MNF

+0

Ich habe kein dbcontext-Schema. Ich verwende Code First Ansatz – StepUp

0

Ihr Code erstes Modell spiegelt Ihr DB-Schema nicht wider Ich kann die Schedule-Klasse eine Liste des Seances enthält, so nehme ich an, dass die Beziehung zwischen diesen beiden Klassen ist eine Eins-zu-viele:

Schedule 1-* Seance 

Statt in Ihrem DB-Schema des Spiel Tabelle ein Feld enthält, das nicht ist zugeordnet in Ihrem Modell (IdSeance), die auch benötigt wird (NOT NULL-Constraint). Auch dies scheint ein Fremdschlüssel für die Tabelle Seances zu sein, aber keine FOREIGN KEY-Einschränkung wird deklariert. Dieses DB-Schema ist dieser Art von Beziehung (viele-zu-eins) ähnlicher:

Welches ist das Gegenteil.

Bevor Sie fortfahren, ermitteln Sie bitte die korrekte Beziehung zwischen Ihren Entitäten und denken Sie daran, genau jedes Feld in Ihrer Klasse abzubilden, das in der Datenbank vorhanden ist. Denken Sie auch daran, diese Felder als Fremdschlüssel zuzuordnen, wenn sie nicht der EF-Konvention für Navigationseigenschaften entsprechen. Sie können es mit attributes oder dem fluent API tun.

Verwandte Themen