Ich habe dies auf ein Problem zwischen Code First und Database First EF eingegrenzt, bin mir aber nicht sicher, wie ich es beheben soll. Ich werde versuchen, so klar wie möglich zu sein, aber ich vermisse hier ehrlich gesagt etwas von dem Verständnis. Dies ist Entity Framework 4.4
Ich habe ein Projekt geerbt, in dem Entity Framework verwendet wurde, aber viele der tatsächlichen Dateien wurden gelöscht, ohne dass es einen wirklichen Weg gab, zurück zu gehen. Ich habe EF (Datenbank zuerst) erneut hinzugefügt und ein T4-Setup repliziert, um das das Projekt herum erstellt wurde. Es wurden Codeversionen aller Datenbankmodelle und eine DBContext-Codedatei generiert.
Wenn meine Verbindungszeichenfolge wie eine "normale" .NET-Verbindungszeichenfolge aussieht, wird eine Fehlermeldung angezeigt, dass eine ungültige Spalte mit dem Namen "ProcessState_ID" nicht vorhanden ist. ProcessState_ID befindet sich überhaupt nicht in der Codebasis, nicht in der EDMX-Datei oder so. Dies scheint eine automatische EF-Konvertierung in der Abfrage zu sein.
Wenn ich die Verbindungszeichenfolge mit dem Entity Framework-Modell übereinstimme, funktioniert sie einwandfrei.
Beim Versuch, den vorherigen Code mit Entity Framework abzugleichen, möchte ich die "normale" .NET-Verbindungszeichenfolge beibehalten.
Ich habe hier also zwei Fragen: 1. Was ist ein guter Weg, um von einer normalen Verbindungszeichenfolge zu einer EF-Verbindungszeichenfolge im Code zu gelangen? 2. Gibt es hier einen anderen Fix, den ich nicht sehe, um den ungültigen Spaltennamenfehler zu stoppen?
quelle
public virtual Person Person { get; }
Antworten:
Überprüfen Sie, ob Sie ICollections haben.
Was ich herausgefunden habe, ist, wenn Sie eine ICollection haben, die auf eine Tabelle verweist, und es keine Spalte gibt, die herausgefunden werden kann. Sie erstellt eine Spalte, in der Sie versuchen können, die Verbindung zwischen den Tabellen herzustellen. Dies passiert speziell bei ICollection und hat mich "verrückt" gemacht, um es herauszufinden.
quelle
Dies ist ein später Eintrag für diejenigen (wie ich), die die anderen 2 Antworten nicht sofort verstanden haben.
So...
EF versucht, den Namen EXPECTED aus der KEENT-REFERENZ DER PARENT TABLES zuzuordnen ... und da ... der Name der FOREIGN KEY in der CHILD TABLE-Beziehung der Datenbank "geändert oder gekürzt" wurde, wird die obige Meldung angezeigt.
(Dieser Fix kann zwischen den Versionen von EF unterschiedlich sein.)
Für mich war
das Update : Hinzufügen des Attributs "ForeignKey" zum Modell
quelle
Category_Id
. Sie haben über die Korrekturen für verschiedene Versionen von EF gesprochen, oder? Ich verwende EF 6.0. Was ist das Update, das ich nicht anwenden kann?*_ID
. Das Einbeziehen der Rückreferenz hat gut funktioniert.[MetadataType(typeof(MetaData))] public partial class Tour { public class MetaData { [ForeignKey(nameof(TourCategory))] public virtual TourCategory TourCategory { get; set; } } }
Heilige Kuh - nach vielen Stunden des Versuchs habe ich es endlich herausgefunden.
Ich mache zuerst eine EF6-Datenbank und habe mich über den Fehler "Umfang unbekannte Spalte" gewundert - es wurde aus irgendeinem Grund ein Tabellenname generiert, der den Spaltennamen unterstreicht, und versucht, eine nicht vorhandene Spalte zu finden.
In meinem Fall hatte eine meiner Tabellen zwei Fremdschlüsselreferenzen auf denselben Primärschlüssel in einer anderen Tabelle - ungefähr so:
EF erzeugte einen seltsamen Spaltennamen wie
Owners_AnimalID1
undOwners_AnimalID2
fuhr dann fort, sich selbst zu brechen.Der Trick dabei ist, dass diese verwirrenden Fremdschlüssel mithilfe der Fluent API bei EF registriert werden müssen!
Überschreiben Sie in Ihrem Hauptdatenbankkontext die
OnModelCreating
Methode und ändern Sie die Entitätskonfiguration. Vorzugsweise haben Sie eine separate Datei, die dieEntityConfiguration
Klasse erweitert, aber Sie können dies inline tun.Wie auch immer Sie es tun, Sie müssen Folgendes hinzufügen:
Und damit wird EF (vielleicht) anfangen zu arbeiten, wie Sie es erwarten. Boom.
Diesen Fehler erhalten Sie auch, wenn Sie den obigen Fehler mit einer nullbaren Spalte verwenden - verwenden Sie einfach
.HasOptional()
anstelle von.HasRequired()
.Hier ist der Link, der mich über den Berg gebracht hat:
https://social.msdn.microsoft.com/Forums/en-US/862abdae-b63f-45f5-8a6c-0bdd6eeabfdb/getting-sqlexception-invalid-column-name-userid-from-ef4-codeonly?forum=adonetefx
Und dann helfen die Fluent API-Dokumente, insbesondere die Fremdschlüsselbeispiele:
http://msdn.microsoft.com/en-us/data/jj591620.aspx
Sie können die Konfigurationen auch am anderen Ende des Schlüssels platzieren, wie hier beschrieben:
http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx .
Es gibt einige neue Probleme, auf die ich jetzt stoße, aber das war die große konzeptionelle Lücke, die fehlte. Ich hoffe es hilft!
quelle
Annahmen:
Table
OtherTable
OtherTable_ID
Wählen Sie nun eine der folgenden Möglichkeiten:
EIN)
Entfernen
ICollection<Table>
Wenn
OtherTable_ID
beim Abrufen ein Fehler auftrittTable
, gehen Sie zu IhremOtherTable
Modell und stellen Sie sicher, dass dort kein FehlerICollection<Table>
vorhanden ist. Ohne eine definierte Beziehung geht das Framework automatisch davon aus, dass Sie eine FK für OtherTable haben müssen, und erstellt diese zusätzlichen Eigenschaften in der generierten SQL.B)
OtherTableId
zuTable
und
OtherTableId
in derTable
in der Datenbankquelle
In meinem Fall habe ich einen Primärschlüssel, der aus zwei Fremdschlüsseln besteht, falsch definiert:
Der Fehler, den ich erhielt, war "ungültiger Spaltenname Bar_ID".
Durch die korrekte Angabe des zusammengesetzten Primärschlüssels wurde das Problem behoben:
quelle
Für mich war die Ursache für dieses Verhalten ein Problem mit der definierten Zuordnung mit der Fluent-API. Ich hatte 2 verwandte Typen, wobei Typ A ein optionales Typ B-Objekt hatte und Typ B viele A-Objekte hatte.
Ich hatte Mapping mit fließender API wie folgt definiert:
Aber das Problem war, dass Typ B Navigationseigenschaften hatte
List<A>
, also als Ergebnis hatte ichSQLException Invalid column name A_Id
Ich habe Visual Studio Debug an EF DatabaseContext.Database.Log angehängt, um generiertes SQL in das Fenster VS Output-> Debug auszugeben
Und generiertes SQL hatte 2 Beziehungen aus der B-Tabelle -> eine mit der richtigen ID und eine mit der
A_Id
Das Problem für das Problem war, dass ich diese
B.List<A>
Navigationseigenschaft nicht zum Mapping hinzugefügt habe .So musste in meinem Fall die korrekte Zuordnung sein:
quelle
In meinem Fall war die Ursache für dieses Problem eine fehlende FOREIGN KEY-Einschränkung für eine migrierte Datenbank. Daher wurde die vorhandene virtuelle ICollection nicht erfolgreich geladen.
quelle
Ich hatte auch dieses Problem und es scheint, dass es ein paar verschiedene Ursachen gibt. Für mich war es eine id-Eigenschaft, die fälschlicherweise als int statt long in der übergeordneten Klasse definiert wurde, die ein Navigationsobjekt enthielt. Das ID-Feld in der Datenbank wurde als bigint definiert, was long in C # entspricht. Dies verursachte keinen Kompilierungsfehler, verursachte jedoch denselben Laufzeitfehler wie das OP:
quelle
Für mich besteht das Problem darin, dass ich die Tabelle zweimal in meiner App zugeordnet habe - einmal über Code First, einmal über Database First.
Das Entfernen einer der beiden Lösungen löst das Problem in meinem Fall.
quelle
Für mich geschah dies aufgrund der Pluralisierungsprobleme von EF. Für Tabellen, die mit so etwas wie "-Status" enden, glaubt EF, dass der Singular "-Statu" ist. Durch Ändern des Namens der Entität und der DB-Tabelle in "-StatusTypes" wurde das Problem behoben.
Auf diese Weise müssten Sie Entitätsmodelle nicht jedes Mal umbenennen, wenn sie aktualisiert werden.
quelle
Wenn Sie mehrmals Fremdschlüsselverweise auf dieselbe Tabelle haben, können Sie InverseProperty verwenden
Etwas wie das-
quelle
Für mich (mit Visual Studio 2017 und dem Datenbank-First-Modell unter Entity Framework 6.1.3) ist das Problem nach dem Neustart von Visual Studio und der Neuerstellung behoben.
quelle
In meinem Fall haben meine Seed-Methodendaten immer noch eine Tabellenspalte aufgerufen, die bei einer früheren Migration gelöscht wurde. Überprüfen Sie Ihre Zuordnungen, wenn Sie Automapper verwenden.
quelle
In meinem Fall habe ich bereits eine Datenbank (Database Firts). Dank aller Kommentare hier habe ich meine Lösung gefunden:
Die Tabellen müssen die Beziehung haben, aber der Name der Spalten muss unterschiedlich sein und das ForeignKey-Attribut hinzufügen.
[ForeignKey ("PrestadorId")] öffentliche virtuelle AwmPrestadoresServicios Colaboradores {get; einstellen; }}
Das heißt, PRE_ID ist PK, aber FK in der anderen Tabelle ist PRESTADOR_ID, dann funktioniert es. Dank aller Kommentare hier habe ich meine Lösung gefunden. EF arbeitet auf mysteriöse Weise.
quelle
Wenn Sie dieses Problem mit einer Navigationseigenschaft in derselben Tabelle haben, müssen Sie den Namen unserer Eigenschaft ändern.
Zum Beispiel :
Du musst dich umziehen
AncestorId
fürPersonId
.Es scheint, dass EF versucht, einen Schlüssel zu erstellen,
ParentId
weil es keine Tabelle mit dem Namen Ancestor finden konnte ...EDIT: Dies ist ein Fix für die Datenbank zuerst!
quelle