Entity Framework (4.3) auf der Suche nach einzigartigen Namen statt des plural (beim entity-name endet mit einem "s")
Hier ist meine situation:
Ich arbeite auf einem ASP.NET MVC 3-Anwendung für eine Weile. Es hat eine Datenbank (gebaut aus einem db-Projekt; ich werde ein db-first), für die habe ich eine edmx-Modell und dann eine Reihe von POCOs. Mein Entitäten im plural stehen in der Datenbank und POCOs haben einzigartige Namen. Alles Karten schön ohne ein problem.
Oder verwendet werden, um bis ich habe eine neue Tabelle (genannt TransactionStatuses). Jetzt sind alle alten Einheiten noch arbeiten, aber das neue nicht. Wenn ich versuche, eifrig laden Sie es zusammen mit einer verwandten Entität:
var transactions = (from t in db.Transactions.Include(s => s.TransactionStatus) //TransactionStatus - navigation property in Transactions to TransactionStatuses
where t.CustomerID == CustomerID
select t).ToList();
Bekomme ich
Ungültiger Objektname 'dbo.TransactionStatus'.
Ich selbst hatte ein einfacher test:
List<TransactionStatus> statuses = db.TransactionStatuses.ToList();
= Gleiches Ergebnis.
Habe ich aktualisiert (und sogar neu erstellt) edmx aus der db und durchgemacht haben, hin und her und versucht herauszufinden, was anders ist, ist das mapping für dbo.TransactionStatus*es* die Ausflüge, die das ganze bis.
Ob jemand kann mich in die Richtung ein Update, es wäre wunderbar.
P. S. ausschalten Pluralisierung ist nicht eine option, danke.
Update: habe ich es herausgefunden - meine Antwort unten.
Das ist das problem, SQL hat den einzigartigen Namen... und ich bin versucht, herauszufinden, warum und wie es zu lösen ist.
InformationsquelleAutor Dmitry Selitskiy | 2012-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist wahrscheinlich passiert, weil, obwohl die Absicht war, die die Datenbank verwenden Erste Strömung, in der tatsächlichen Tatsache, die die Anwendung verwendet Code First zu tun, die Zuordnung. Lassen Sie mich erklären, ein wenig mehr, weil das verwirrend sein kann. 🙂
Bei der Verwendung von Datenbank Zuerst mit dem EF-Designer und der DbContext-Vorlagen in Visual Studio drei sehr wichtige Dinge passieren. Ersten, die die neuen Entity Data Model-Assistenten fügt eine Verbindungszeichenfolge, um Ihre app mit details der Datenbank Erste Modell (d.h. der EDMX), so dass, wenn die Anwendung ausgeführt wird, findet es dieses Modell. Die Verbindungszeichenfolge wird in etwa so Aussehen:
Zweiten, den erzeugten Kontext-Klasse macht einen Aufruf an die Basis DbContext-Konstruktor die Angabe der Namen dieser Verbindung Zeichenfolge:
Dieser erzählt DbContext zu finden und verwenden Sie die "MyEntities" connection-string in die config. Mit "name=" bedeutet, dass der DbContext wird werfen, wenn es nicht die Verbindung Zeichenfolge-es wird nicht einfach gehen Sie voran und erstellen Sie eine Verbindung mit dem Konvent.
Wenn Sie möchten, verwenden Sie Zunächst die Datenbank, dann müssen Sie eine Verbindungszeichenfolge verwenden, wie die, die generiert wird. Insbesondere muss das Modell enthalten Daten (csdl, msl, ssdl aus der EDMX), und Sie müssen sicherstellen, dass DbContext findet. Seien Sie sehr vorsichtig beim ändern der Aufruf der Basis-Konstruktor.
Die Dritte Sache, die passiert ist, dass OnModelCreating überschrieben, in der generierten Kontext, und machte sich zu werfen:
Dies ist notwendig, da OnModelCreating wird immer nur aufgerufen, wenn der Verwendung von Code First. Dies ist, weil OnModelCreating ist alles über das erstellen des Modells, aber wenn Sie die Datenbank Zuerst das Modell existiert bereits-es gibt nichts, um zur Laufzeit erstellen. Also, wenn OnModelCreating genannt wird, dann ist es wahrscheinlich, weil Sie begonnen haben, mit der Code Zunächst ohne Bedeutung zu, die in der Regel aufgrund einer änderung der Verbindungszeichenfolge oder der Aufruf der Basis-Konstruktor.
Nun, es könnte sein, dass Sie möchten, um die Verwendung von Code First für die Zuordnung zu einer vorhandenen Datenbank. Dies ist eine große Muster und vollständig unterstützt (siehe http://blogs.msdn.com/b/adonet/archive/2011/03/07/when-is-code-first-not-code-first.aspx), aber Sie müssen sicherstellen, dass Zuordnungen entsprechend einrichten, damit das funktioniert. Wenn die Zuordnungen nicht korrekt konfiguriert wurde, dann bekommt man von Ausnahmen wie in dieser Frage.
Ja, das ist es definitiv. Ich habe die richtige connection string in meine DAL-Projekt aber nicht in mein MVC-app-Projekt (wo ich hatte eine normale Verbindungszeichenfolge). Ich habe versucht, ändern Sie diese entsprechend der Punkte, die Sie aufgeworfen, aber ich habe immer die UnintentionalCodeFirstException und ich kann nicht herausfinden, was nannte es..., in Zusammenfassung, ich danke Ihnen sehr für die Klärung dieser. Dies ist das erste mal, dass ich eine klare Unterscheidung zwischen Code-First und DB-ersten.
InformationsquelleAutor Arthur Vickers
Hab!
Schreckliche, schreckliche Erfahrung...
Kurz: EF kann nicht korrekt in den Plural entity-Namen, die Ende mit "s" (z.B. "status", "campus", etc.)
Hier ist, wie ich es geschafft habe und Beweise.
TransStatus
und dergleichen - kein Glück.sheep
undgoose
. Das gab mir zu denken "was ist, wenn er das problem in den tatsächlichen Namen der Person?"status
im besonderen und gefunden dieser Bericht, der das problem auf Verbinden. Ich Eilte, um zu versuchen, die Umbenennung meiner Person...TransactionStatuses
zuTransactionStates
(während auch halten Sie die Spalten, wieStatusID
) das Problem! Ich kann jetzt bekommenList<TransactionState> statuses = db.TransactionStates.ToList();
status
im Namen... Aber nach stimmlich beschweren sich über dieses zu einem Freund, den ich vorgeschlagen wurde, vielleicht ist das problem mit dem Wort endet mit "s"... Also habe ich beschlossen, check it out.Campuses
- und matching-POCOCampus
(und aktualisiert die edmx). Hab den einfachen testList<Campus> test = db.Campuses.ToList();
und bekam die nun erwartetenSo dort gehen Sie, die mächtigen EF nicht in den Griff Pluralisierung der Wörter endend mit "s". Hoffentlich wird der nächste Arme Kerl schlagen das problem zu finden, diese Frage, und speichern Sie ihn oder Sie selbst 3-4 Stunden des Schmerzes und der frustration.
und der Pluralisierung service ist definitiv begrenzt. Ich Stimme zu, dass. Aber ich bin nicht zu verstehen, wie, nichts zu tun hat mit dem Namen der Datenbanktabelle.
Dmitrij, hier ist eine kurze camtasia der default-Verhalten, das sollte in der Regel geschieht. Mindestens Sie'lls ee, warum ich bin verwirrt von Ihrem problem. Uhr, und dann schauen wir uns Ihre db/model/profiler, um zu sehen, warum Sie immer eine andere Erfahrung. (Ich habe nicht berühren Sie eine beliebige Standardwerte) dl.dropbox.com/u/13420868/dmitrys.mp4 (kein Ton)
siehe Antwort von ajcvicker, er hat mich in die richtige Richtung, und es nun wohl beseitigt Ihre Verwirrung. Technisch jedoch die Antwort steht immer noch: Pluralisierung-Dienst kann nicht pluralise "Status" und "Campus" 🙂
respektvoll nicht einverstanden mit Ihrer vorgeschlagenen Antwort. es ist absolut richtig, dass die Pluralisierung Dienst kann nicht in den Plural status & campus, sondern [es sei denn, etwas geändert in EF code first, dass ich bewusst bin] die Pluralisierung Dienste werden nicht für die Datenbank-Tabelle Namensgebung...nur für das entityset Namen. Und dein problem war durch den Namen der Datenbank, nicht der entityset-name. Es sah wie Pluralisierung, war dieses problem verursacht, aber es war nicht beteiligt. 🙂 Erste Code wurde im Anschluss an das übereinkommen zu erwarten, dass ein Tabellenname entspricht dem entity-Namen.
InformationsquelleAutor Dmitry Selitskiy
Die Sie erwähnen, EDMX, aber ich kann nicht sagen, ob Sie tun databse erste mit EDMX-oder code-first und nur mit EDMX, um zu sehen, was Los ist.
Wenn Sie Code First, dann können Sie eine Konfiguration zu verwenden, geben Sie den Namen der Tabelle. Daten-Annotation [Table("TransactionStatuses")], fließend ist modelBuilder.Entität().ToTable("TransactionStatuses").
(Ich Schreibe die Anmerkungen und die fluent-code aus dem Speicher, so Doppel-check Referenzen. 😉 )
Wenn Sie zunächst die Datenbank, die SSDL sollte man sich unbedingt bewusst sein, der name der Datenbank-Tabelle, so dass ich vermute, dass Sie der Verwendung von code first & der edmx ist nur für die exploration. (???)
hth
InformationsquelleAutor Julie Lerman
Seufzer. Gleiche Art von Problem mit der Klasse und dem Modell-Foto und Video; es ist auf der Suche nach der Tabelle Photoes und Videoes. Ich hasse es einfach nur der name der Tabelle, aber nicht viel von einer Wahl, wie es aussieht.
InformationsquelleAutor drewid