Laden...

ASP MVC4 Scaffolding

Erstellt von wickedcsharper vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.184 Views
wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren
ASP MVC4 Scaffolding

Hallo zusammen,

ich arbeite mich gerade in mvc 4 ein.
Habe eine Klasse gebaut mit Properties. Sooo.

gehe auf Controller und baue mir den Controller
und gebe dabei die Modelklasse an und erstelle einen neuen Kontext

Per Scuffolding generiert mir die IDE nun den dataContext und die
CRUD Operationen, sowie die Datenbank. Schön soweit.

Mit der nächsten Klasse verfahre ich genaus so.

Nun schaue ich im App_Data ordner und sehe, dass VS2012 mir für jeden
DataContext bzw. für jede Klasse eine eigene Datenbank anlegt ?

Ist das so gewollt ? Wie bekomme ich alle Klassen bzw. Modelle in eine Datenbank migriert.
Das kann es doch so nicht sein oder?

Bitte um Ratschläge, was ich falsch mache...

Gruß

TS

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.806 Beiträge seit 2008
vor 11 Jahren

Was Du genau machst: keine Ahnung.
Aber Deiner Erklärung zur Folge wirst Du höchstwahrscheinlich die "Hilfe" der Visual-Studio-Fenster in Anspruch nehmen.

Fragen Vorweg: wieso lagerst Du die Modellklassen nicht gleich in ein extra Projekt aus?
Was für einen Kontext erstellst Du? Muss ja irgendeine Basis haben.
Redest vom Entity Framework?

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Hallo,

nun im Netzt gibts ein paar Videos (z.B. dieses
http://www.asp.net/vnext/overview/aspnet-mvc/aspnet-mvc-4 )

Hier wird beschrieben, wie man aus einer Modelklasse
und einem Controller einen DataContext erzeugt und mittels
Scaffolding (kommt aus dem Ruby Bereich und ist seit mvc 2 oder 3
auch in Visualk Studio integriert) die Datenbank und alle CRUD Strukturen generiert.
Das geht mittels Entity Framework.

geht super einfach. Es ist eben nur so, dass mittels Scaffolding
jedesmal eine neue Datenbank erzeugt wird, wenn man aus dem Model
und dem Controller den Datenbankkontext erzeugt.

Probier es aus. Aber es muss doch möglich sein aus den vorliegenden Modelklassen eine einzige Datenbnak zu generieren. Die Frage ist wie ?

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.806 Beiträge seit 2008
vor 11 Jahren

Ich rate Dir persönlich das Vorgehen , wie es in diesem Video gezeigt wird, ab, wenn Du nicht nur nen kleines Webtool brauchst, bei dem es nicht wichtig ist, wie performant oder sicher das ganze abläuft.

Vieles im ASP.NET MVC Tutorial Bereich von Microsoft suggeriert Leichtigkeit, damit der Einstieg ohne große Hürden von statten geht.
Für größere und dann auch produktive Anwendungen kommen dann recht schnell die ersten Probleme (zB Peformance der Uri-Generierung, fehlende ViewModels zum Übergeben von Auswahldaten. etc etc).
Wenn es dann noch eine eher höhere frquentierte Webanwendung ist, dann kommt auch noch die absolut magere Performance des Entity Framework als enger Flaschenhals hinzu.

Egal ob Ruby oder VS: so nen automatisches Generieren nimmt Dir auch nur ein Teil hab und schränkt Dich in der Flexibilität eher ein.

--
Warum Du mehrere Datenbanken bekommst kann ich Dir aber leider nicht sagen.
Habe diese Variante noch nie verwendet.

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Hallo Abt,

Danke für den Kommentar! habs rausgefunden:
Beim Scaffolding muss man jeden Controller dem gleichen Datenkontext zuweisen.

Das bedeutet, man legt für jede Anwendung einen Datenkontext (Klasse) an
und speichert dann den neuen Controller mit dem jeweiligen Model unter der gleichen KontextKlasse ab (z.B. StoreDataContext). Dann werden alle Modelle als Tabellen in der gleichen Datenbank gespeichert.

Was das Scaffolding angeht finde ich fdas so wie es jetzt funktioniert eine tolle Sache.
Und genau da müßen wir auch hin. Angenommen du hast 100 Modelklassen mit 50 Properties.

Wie lange willst du denn dran sitzen, bis du das manuell zusammengefrickelt hast? Zudem dann noch fehlerträchtig. Die ganzen CRUD Operationen manuell - der Horror !
Selbst bei WinForms habe ich nacher fast nur noch mit Codegeneratoren gearbeitet.

Je nach Klassenaufteilung bin ich somit an einem Tag fertig wofür du sonst Wochen brauchst.
Da stört das bischen Performanceverlust ehrlich gesagt nicht.
Und ob das EnityFramework ein Flaschenhals ist - nunja das sind irgendwie alle OR-Mapper.

Aber ich denke , da wird sich bestimmt noch was tun bzgl. Performance

Die Frage ist auch, ab wann die Performance nun wirklich in die Knie geht und warum.
Wie greifst du denn auf die Daten zu ?

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.806 Beiträge seit 2008
vor 11 Jahren

Ich verwende kein Entity Framework mehr, sondern nur noch die MongoDB.
Erstelle meine POCOs echt und nicht so hingefrickelt wie beim EF; bei dem man zig Dinge beachten muss, damit das performant läuft.

Ich hatte es mal in nem anderen Thread als vergleich gebracht:
habe ein paar Millionen Daten in die MongoDB geschrieben: keine Minute gebraucht
Plain SQL ohne ORM: einige Minuten
Entity Framework.: abbruch nach einigen Stunden.

MongoDB mit C# Driver ist ca. 100-1000-fach performanter als plain MSSQL ohne ORM.
MongoDB vs. SQL Server 2008 Performance Showdown
Der Blog-Eintrag ist 2,5 Jahre alt: seitdem hat sich nochmal einiges zum Vorteil von MongoDB mit C# getan. Für mich gibts hier keine Alternative mehr.
Selbst als Embedded Database verwende ich die MongoDB mittlerweile - weil es einfach so vieles erleichtert und man die Performance nicht nur messen, sondern auch spüren kann.
Siehe mein Leitmotto: speed is a feature.

Ja, ich schreibe mein CRUD von Hand, weil das, was mir das VS da generiert, nicht mir der funktionsweise einer RIA in meinen Augen kompatibel ist.
Ich lösche ja oft nicht einfach nur, oder erstelle einfach nur. Nein, ich biete dem Anwender ja auch zum Beispiel bei der Registrierung seines Benutzers ja auch Selekt-Boxen an.
Wie soll ich die denn füllen, wenn ich direkt die Entity an die View übergebe, statt ein ViewModel zu nutzen. Unytpisiert über die TempData? Sicher nicht.

Bezüglich der Performance wird sich mit ganz großer Sicherheit nichts tun am Kern. Das würde vieles, was "einfach ist", über Bord werfen.
Es bei ASP.NET MVC sooo viel in Sachen Performance, die man von Hand verbessern muss:

  • Route-Generierung (am besten auch keine Magic-Strings! ASP.NET MVC - Route Cache)
  • Dynamic + Static Caching
  • PartialViews verwenden, damit nicht alles 100-fach gerendert wird
  • Sessions sind unperformant. Wenn nicht unbedingt nötig stateless arbeiten
    Dahingehend kann auch TempData nicht mehr verwendet werden, da diese Sessions nutzen
  • ETags muss man manuell hinzufügen
  • keine direkte Unterstützung von CNDs...

Was mich in den Tutorials enorm stört:

  • nirgens werden Generic Repositories verwendet
  • Entities sind immer sehr einfache Beispiele und selten an der Business-Realität

Wie gesagt: wie leider so oft in Visual Studio sind diese ganzen Designer und automatischen Generatoren eine super Hilfe für den Einstieg (Beispiel Entity Framework und EDMX-Designer).
Aber sobald man dann doch mal vom gedachten Weg abkommt (Eine Entity Klasse serialisieiren -> Icollection kann nicht serialissiert werden, das es ein interf.) gibts Probleme mit solch einem Teil.

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Hi,

ok bei einigen Millionen Datensätzen kann das schon sein. Das ist ja schon "BigData"

Aber EF ist doch in aller Munde. Der Schwichtenberger turnt doch nur damit rum
auch in seinem neuen Buch über MVC 4 was bald kommt (anhand seiner virtuellen Fluggesellschaft).
Ich dachte, dass sei alles so toll ?

Das MongoDB aber soviel schneller ist als der SQL Server, das wundert mich.
Nun ja im Grunde sind die Microsoft IDEs auch komplett überfrachtet.
Die Installation von VS 2012 und SQL Server 2008 dauert ja Stunden

Was ist denn deines Wissens allgemein die performanteste Webumgebung/Sprache
welche die schnellste bei der Entwicklung einer großen Webanwendung?

ASP klassisch, ASP MVC 2-4, Java Servlets, Ruby on Rails oder PHP oder ? mit
Access, SQL Server (CE), MySQL, PostgreSQL, MonoDB oder ?

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.806 Beiträge seit 2008
vor 11 Jahren

EF ist nen tolles Ding - wenn die Performance nicht wichtig ist.
Trugschluss: EF ist nun Standard im MVC4; also eine Webanwendung Und vorallem hier kommt es unheimlich auf Performance an.
Schau Dir allein mal an, was das Ding intern bei einem Insert tut: unmengen an Objekten generieren und mit Reflection rumfuchteln. Wie soll das performant sein?

Wenn wir von Hochsprachen reden dann dürfte in Sachen Performance ASP.NET MVC bei Beachtung aller Gegebenheiten als Single-Application die Nase vorn haben. Ich glaube aber nicht, dass Java Spring so viel langsamer sein wird. Aber außer Java und ASP.NET gibts hier ja auch nicht viel.
PHP hingegen hinkt welten hinterher.

Den größten Brocken bei der Performance macht natürlich das Caching aus, und da spielt dann eher die Infrastruktur und der Webserver eine Rolle, statt die Technologie. Die ist nur für die Business-Daten interessant. Man schau sich an, wie Hochperformant Facebook ist - troz (zugegeben mit enorm hohen Aufwand optimiertem) PHP.

Wenns allgemeiner geht, wird Ruby on Rails sicherlich performanter sein als ASP.NET MVC oder Java.
Entscheidender bei solchen Angelegenheiten sind ja oft die Kosten. Eclipse und Linux-Server-Farmen sind natürlich deutlich günstiger als Visual Studio und Microsoft Server. Dahingehend ist oft hier schon die Technologie entschieden.
Weitere Dinge, die sich bei Spring und MVC unterscheiden ist eben auch, wie viel andere Technologien angeschlossen werden. Oft (zB bei Amazon) wird Java und Ruby gemischt. Es werden nicht nur Java Pages versendet, sondern eben auch Ruby integriert, was bei ASP nicht so einfach möglich ist.

Aus dem Finanzsektor liest man, dass einige eben doch noch mit PHP arbeiten und das Zeug dann an Delphi schicken, weil das einfach schneller ist.
Oder eben bei ASP, die noch F# integrieren.

Kommt ja auch nicht immer nur auf die Ausführungsgeschwindigkeit bei der Wahl an, sondern auch darauf, was die Fachkräfte denn so können. Und die meisten Studenten lernen eben direkt Java statt ASP.
Wenn ich im Studium mit Java zutun hab ärgere ich mich immer, wie umständlich da vieles ist. Bei anderen Dingen denke ich: schade, dass .NET das nicht kann.
Kaum ein IT Student, der mit Java aufgewachsen ist, macht sich die Mühe um C# zu lernen. Zuviel Fanboy-Gedanken dahinter.

PS: wenn man den Gerüchten glaubt verwendet selbst Microsoft im Appstore MongoDb 😉
Weitere bekannte Nutzer wären: Amazon, Facebook, Twitter, Fourquare, Instagram..
Die Geschwindigkeit muss Dich nicht wundern: MongoDB ist keine relationale sondern eine Dokumenten-Datenbank (Key-Value-Prinzip: das so ziemlich performanteste Daten-Konstruktur, das man bilden kann). Es gibt keine Joins, keine Relationen - dafür aber gewollte und gut zu überlegende Redundanzen.

Keine große Webseite wird mehr bei neuen Dingen auf eine relationale Datenbank setzen. Sind in der Web-Welt, wo es einfach sehr auf Erreichbarkeit, Performance und unmengen an Daten und wenig auf ACID ankommt, meist nicht wirklich die erste Wahl.

Noch nen paar Daten, die ich mal für nen Vortrag gesammelt hab (um das zu verdeutlichen, Stand Oktober 2012):

  • über Twitter werden pro Tag 7 TB an neuen Datenbank-Daten generiert
  • Über Facebook werden pro Monat mehr als 140 Milliarden Nachrichten versendet
  • Bei Amazon werden pro Monat 1 Million neue Produkte hinzugefügt
    (Für Anzahl der Bestellungen habe ich nichts gefunden, aber in der Weihnachtszeit hat Amazon in Spitzenzeiten (nicht dauerhaft) fast 200 Bestellungen pro Sekunde. Rekord war am 29. Nov 2011 mit 13,7 Millionen Bestellungen an diesem Tag.

--
Wenns um ASP geht:
ASP.NET MVC2 zusammen mit aspx-Seiten ist schneller als MVC 3 oder MVC4 mit Razor-Pages.
Wichtig bei LINQ Queries ist immer, diese zu Compilieren (zB im Repository).
Möglichst wenig Reflection, und wenn, dann mit Caching (verwende ich aktiv bei MongoDB)
Auf FluentMongo oder MongoLINQ sollte man - auch wenns bequem is - verzichten.

An die MongoDB kommt in Sachen Geschwindigkeit derzeit niemand in dieser Größenordnung ran.

wickedcsharper Themenstarter:in
160 Beiträge seit 2008
vor 11 Jahren

Hi Abt,

super Tipp mit der MongoDB. Hab mal ein bischen gegoogelt.
Scheint mir eine äußerst interessante Sache zu sein.

Ich bin eh kein Freund von Normalisierungen in relationalen DBs.

Interessant sind auch objektorientierte Datenbanken (im Web wegen Performance wohl eher wieder nicht).
Aber z.B. in Forms Anwendungen. Damit hat man eigentlich direkt, was man mit OR Mappern ebenfalls versucht. Nur eben ohne Reflection und den ganzen Overhead.
Person t = new Person().
t.name = "Müller";
t.save() --- fertig kein OR, kein Ado nichts. Nachteil : keine Tools zum ansehen der Daten wie z.B.
Managementstudio oder myphpAdmin.

Aber die dokumentenbasierten Datenbanken wie Raven oder mongoDB
ebenfalls super, da schnell, performant und eben nicht zwingend normalisiert.
Flache Tabelle reingedengelt und gut is 😉
Super...

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

16.806 Beiträge seit 2008
vor 11 Jahren

Für MongoDB emfehle ich MongoVUE als "Management Studio".