Laden...

Der Fehler:Meta data ***** können nciht abgerufen werden

Erstellt von bafla13 vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.449 Views
B
bafla13 Themenstarter:in
23 Beiträge seit 2012
vor 11 Jahren
Der Fehler:Meta data ***** können nciht abgerufen werden

Hallo,
ich bin ein Anfägner mit ASP.NET und versuche ein Controller zu erstelln aber kriege immer en Fehler.
Erste clicke ich rechts auf ->Controllers->hinzufügen->Controller,
Dann kommt eine Nachrichte:> Fehlermeldung:

Metadaten für "MvcMovie.Models.Movie" könnnten nciht abgerufen werden,using the same DbcCompiledModel to create context against different types of databases servers is not supported,instead create a seperate DbCompiled Model for each type of server being used.

ich versuche eigentlich nur dieses Touturial zu machen,vielleicht könnte das hilfreic h sein.
http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/accessing-your-model%27s-data-from-a-controller

Vielen Dank für jedes Hilfe:)

16.834 Beiträge seit 2008
vor 11 Jahren

Genau Fehlermeldung bitte. Wenn man nach Deiner Fehlermeldung googelt erhält man ca. 10 verschiedene, von denen keine 100%tig passt und mehrere ähnlich sind.

Also nochmal ein Versuch für Dich:

  • Genaue Fehlermeldung inkl. Exception
  • Wo taucht sie auf? HTML? C# Code? Webserver-Fehler?

Siehe auch [Hinweis] Wie poste ich richtig? Punkt 5

B
bafla13 Themenstarter:in
23 Beiträge seit 2012
vor 11 Jahren

Wurde bearbeitet:)

16.834 Beiträge seit 2008
vor 11 Jahren

Also das ist kein Fehler von ASP.NET. Du verwendest übrigens ASP.NET MVC (es gibt auch noch ASP.NET WebForms, was eine ganz andere Geschichte ist).

Was Du genau machst sehe ich - und die anderen - ohne Code schlecht.
Aber offensichtlich tust Du was ungültiges.
Den genauen Code-Teil, der den Fehler bei Dir erzeugt, hast Du leider noch nicht angehängt - somit bleibt nur das Raten; und darauf hab ich nich so arg Lust.

Ich vermute, dass Du zwei verschiedene EF Provider verwendest.
Eventuell SqlClient und SqlServerCe. Jedenfalls ist auch das meist der Fehler, wenn man nach "using the same DbcCompiledModel to create context against different types of databases servers is not supported" googelt.

S
269 Beiträge seit 2010
vor 11 Jahren

Ich weiß der Thread ist alt aber aus aktuellem Anlass bin ich in genau den selben Fehler reingerasselt.

(Hinweis an Abt: Er hat doch geschrieben, was er macht: Im Projektmappen-Explorer in seinem Projekt Rechtklick auf Controllers -> Hinzufügen -> Controller.
Was in der Beschreibung fehlt ist der weitere Vorgang:

  • Auswahl der Vorlage = "MVC-Controller mit Lese-/Schreibaktionen und Ansichten unter Verwendung von Entity Framework"
  • Auswahl der Modellklasse (in seinem Fall nach dem Tutorial "Movie (MvcMovie.Models)")
  • Auswahl der Datenkontextklasse (in seinem Fall "MovieDBContext (MvcMovie.Models)")
  • Klick auf "Hinzufügen"
    Anschließend "ploppt" nach kurzer Zeit eine MessageBox mit eben dieser Fehlermeldung auf.)

Bisher bin ich auf mehrere Ansätze, aber keine wirklichen Lösungen gestoßen.
Mein erster (eigener) Ansatz war die Sektion "<entityFramework>" in der web.config. Diese habe ich angepasst an meinen verwendeten Datenbank-Provider (laut verschiedener Aussagen im WWW nicht notwendig, da es sich hierbei wohl um eine "Fallback"-Angabe handelt für den Fall, dass kein ConnectionString vorhanden ist, der von EF genutzt werden kann/soll):

<entityFramework>
	<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
		<parameters>
			<parameter value="System.Data.SqlServerCe.4.0" />
		</parameters>
	</defaultConnectionFactory>
</entityFramework>

leider hat das bezüglich der genannten Fehlermeldung keine Änderung gebracht.

Im WWW gibt es sonst nur Workarounds, wie z.B. das Ändern des ConnectionString-Namens damit dieser nicht mehr von EF zur Datenkontextklasse zugeordnet werden kann. Anschließend lässt sich der Controller erstellen und danach kann man den Namen wieder zurückändern. Temporäres Auskommentieren des ConnectionString in der web.config hat den gleichen Effekt.
Aber es ist und bleibt ein Workaround und keine Lösung!

Auch die Installation des NuGet-Packages EntityFramework.SqlServerCompact hat keine Änderung gebracht.
Ebenso die Anpassung des Konstruktors meiner Datenkontextklasse mit Aufruf von base(<name des ConnectionString>) hat keinen Erfolg gebracht:

public WorktimeContext() : base("WorktimeContext") { }

klar könnte ich base() mit einem "Namen" aufrufen, welcher nicht als ConnectionString definiert ist, aber das ist dann nur eine andere Version des weiter oben schon erwähnten Workarounds.

so far
Karill Endusa

106 Beiträge seit 2011
vor 11 Jahren

Hallo Karill Endusa,

Warum erstellst du nicht von Hand eine Klasse die sich von "Controller" ableitet?
Wenn ich mich nicht täusche ist "Controller hinzufügen..." nichts anderes als eine Vorlage die ein bißchen Schreibarbeit erspart.

Mfg
Rabban

S
269 Beiträge seit 2010
vor 11 Jahren

"ein bisschen" ist gut...
Es werden der Controller und die Views für CRUD Operationen erstellt.
Wenn ich für jede Entity das Ganze von Hand machen müsste, geht mir einiges an Zeit flöten, die ich für wirklich sinnvolle Arbeit einsetzen könnte.
Würde ich EF nur im privaten Bereich nutzen hätt ich damit weniger ein Problem, aber mit solchen Problemen kann ich nicht in das kommende Projekt gehen.

so far
Karill Endusa

106 Beiträge seit 2011
vor 11 Jahren

Wenn ich für jede Entity das Ganze von Hand machen müsste, geht mir einiges an Zeit flöten

Diesen Aufwand sehe ich jetzt nicht so. Wir haben hier auch einige größere Webprojekte in unserem Haus und erfahrungsgemäß müssen wir eh die meisten Views nochmal anfassen, bzw. komplett überarbeiten. Somit ist, aus meiner Sicht, die Zeitersparnis minimal, da die Vorlage nur die Dateien anlegt.
Wenn du dir aber Zeit sparen willst, dann kannst du doch mit Snippets arbeiten, die genau das gleiche für dich machen. Dann ist dein einziger Aufwand, die Dateien anzulegen.

MfG
Rabban

16.834 Beiträge seit 2008
vor 11 Jahren

Meiner Ansicht nach geht mehr Zeit mit den VS-Vorlagen flöten.
Wieso? Weil die Mist sind und man sie umschreiben oder rauslöschen muss, damit diese anständig verwendbar wären.

VS Vorlagen arbeiten immer damit, dass eine Entitiy von der View am Controller ankommt. Ohne Repositories, ohne klare Trennung der Schichten. Nirgends wird gezeigt, wie man Business-Code sauber auslagert.
Sowas ist alles andere als realitätsnah. Das alles soll auch gar nicht realitätsnah sein, sondern den Anfängern nur unterstützend zur Seite stehen - wie alle Beispielprojekte von MS.

Oft muss man doch einer Entität noch weitere Dinge mitgeben wie LastUpdatedTime oder ähnliches, was gar nicht von der Form an die Action mitgebracht wird.
Zudem gehören Entities nicht in die View. Dafür gibts ViewModels und zum Empfang an der Action SubmitModels..

Und noch nen Beispiel:
Wie sieht so ne URL meist aus?

Movie/Add -> Neue Hinzufügen
Move/{name} -> Ansicht
Movie/{name}/Edit -> Editieren
Movie/{name}/Whatever/Foo

Ist sowas noch durch einen einfachen Controller abbildbar?
Korrekt: nein ist es nicht. Entweder man muss seinen Controller verunstalten oder man machts sauber und arbietet mit Areas.
Da heißen dann schon nicht mehr die Actions Edit, sondern der Controller - dann sind die Vorlagen zwar für den Eimer; aber die Struktur der Anwendung sauber.

Besser ist das ganze Zeug von Hand zu schreiben.

Ich hab zum Beispiel mindestens zwei Basis-Controller, von denen ich ableite.
Einmal für Sync und einmal für Async-Controller. Dann meist noch Basis-Controller mit und ohne Sessionverwaltung... (zB für Content-Delivery).
Beide haben wiederum Standard-Methoden, um zum Beispiel viel einfacher mit der TempData umgehen zu können. Zum Beispiel wenn aufgrund eines Fehlers eine Umleitung auf eine andere Seite stattgefunden hat.

AddTempError("Sie haben nicht genug Rechte, um diese Seite anzufordern.");
return RedirectToHome();

        protected void AddTempError( string message )
        {
            if ( ViewData[ "TempErrors" ] == null )
            {
                TempData[ "TempErrors" ] = new List<String> { message };
            }
            else
            {
                var tempEntries = TempData[ "TempErrors" ] as List< string >;
                if ( tempEntries != null )
                {
                    tempEntries.Add( message );
                }
                else
                {
                    TempData[ "TempErrors" ] = new List<String> { message };
                }
            }
        }

Beim Aufruf von Home wird dann automatisch der Inhalt aus TempData geladen etc...

Fazit für mich: die Vorlagen von MVC sind alle sehr nett für den Einstieg.
In großen Anwendungen alles andere als zu gebrauchen.

Ich könnt auch mit der Abwertung der Vorlagen gleich weiter machen.
Da wäre die web.config oder die Route-Generierung gleich das nächste Trefferziel.