Laden...

Forenbeiträge von Telefisch Ingesamt 372 Beiträge

24.01.2019 - 11:41 Uhr

Ach Abt, es ist immer wieder schön wie Du einen motivieren kannst.
Kannst Du Deine Kommentare nicht einfach mal für Dich behalten?

"Du hast Dich hier nicht eingearbeitet, Deine Programmierung stinkt, Alles was Du machst ist kein best practice"

Ich hab echt langsam keinen Bock mehr auf dieses Forum.
Ich habe den ganzen Tag überlegt, gestern ob ich hier überhaupt noch ne Farge stellen darf und prompt gibt's wieder auf's Maul!

Kenn zufällig jemand ein Anfängerfreundlicheres Forum als Dieses?
Ich bin's Leid!

24.01.2019 - 10:55 Uhr

Ja, das Abholen der Daten ist sowiet kein Problem.
Nur wie bekomme ich sie an das Treeview gebunden, ohne die View neu zu laden?
Irgendwie stehe ich grade etwas auf'm Schlauch.

...würde man dann den Tree in eine partialview packen und nur die aktualisieren?
Geht das?

23.01.2019 - 16:18 Uhr

Hallo Forum,
ich muss einen Treeview (bootstrap-treeview von Jon Miles) mit Daten füllen. Aufgabe dieses Treeviews ist eine Auswahl an Datensätzen anzuzeigen, die man dann als Vorlage zum Kopieren auswählt.
Da dieser Treeview aber nicht immer benötigt wird, wäre es sinnvoll ihn erst zu füllen wenn er wirklich gebraucht wird.

Dieser Tree ist derzeit in einem hidden modalen Dialog untergebracht und bekommt seine Daten als Json-Text über den ViewBag.
Nun möchte ich quasi in dem Moment wenn der modale Dialog sichtbar wird erst die Daten laden.

Idee war eine Action (JsonResult) mittels Ajax anzutriggern und die empfangenen Daten dann dem Treeview zuzuweisen.
Blöderweise muss dafür aber anscheinend die View neu geladen werden.
Wie könnte man so ein "popup"-Treeview anders erzeugen oder die Daten eben später in die View laden?

Das modale view derzeit:


    <!-- ################### Modaler Dialog zur Auswahl Copy ###################### -->
    <div class="modal fade" id="copyDialog" tabindex="-1" role="dialog" aria-labelledby="copyDialogLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <!-- Header -->
                <div class="modal-header">
                    <h5 class="modal-title" id="copyDialogLabel">Funktionsgruppe aus Vorlage kopieren</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>

                <!-- Body -->
                <div class="modal-body">
                    <form id="functionSelectForm">
                        <div id="copyTree" class=""></div>
                    </form>
                </div>

                <!-- Footer -->
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Abbrechen</button>
                    <button type="button" class="btn btn-primary" id="copyDialogOk">Ok</button>
                </div>
            </div>
        </div>
    </div>

Die Initialisierung sieht derzeit so aus:


    <!-- SCRIPTSECTION -->
    <script type="text/javascript">
// ########## COPYTREE #############
    //CopyTree Initialisieren
    var CopyTree;
    var treeData = @Html.Raw(ViewBag.copyData);
    CopyTree = $('#copyTree').treeview({
        data: treeData,
        showCheckbox: true,
        checkedIcon: "far fa-check-circle",
        uncheckedIcon: "far fa-circle",
        expandIcon: "fa fa-caret-right",
        collapseIcon: "fa fa-caret-down",
        emptyIcon: "fa",
        selectedIcon: "fa fa-map-marker-alt",
        showTags: true,
        levels: 0,
        enableLinks: true
    });
…

23.01.2019 - 12:03 Uhr

Hallo Forum,
in einem anderen Threat hat man mich auf das Drei-Schichten Modell der Programmierung hingewiesen.
Nun dachte ich bisher, dass in ASP.NET MVC der Controller die Logik-Schicht ist, wobei offensichtlich wohl eher zur Präsentationsschicht gehört.

Meine Frage ist daher, wie bzw. wo implementiere ich die Businesslogik?

Derzeit besteht mein Projekt klassisch aus einer Datenbank, diversen Controllern und den zugehörigen Views.

Im Grunde wird ja ein Datensatz im Controller geladen und dem View übergeben:


FunctionGroup functionGroup = db.FunctionGroups.Find(id);
return View(functionGroup); 

Wie würde ich das denn mit einer zwischengeschalteten Logikschicht lösen?
Eine Trennung in drei Schichten macht schließlich nur Sinn, wenn ich sie konsequent überall einsetze.

Gruß Carsten

23.01.2019 - 11:56 Uhr

Ok, dann fange ich nen neuen Threat an...

23.01.2019 - 10:34 Uhr

Hallo MrSparkle,
erstmal danke für den Link, und natürlich erwarte ich nicht dass jemand seine Glaskugel für mich bemüht.
Ich stehe halt vor einem Problem und suche erstmal einen Weg der Ursache näher zu kommen.
Was ich nicht bedacht hatte, dass der Server eventuell deutlich langsamer sein könnte als mein Notebook, auf dem das Debugging gemacht wird.

Daraus und aus den Anregungen hier ergeben sich bei mir neue Fragen, die ich vielleicht vorher stellen sollte, bevor ich dem SQL Server die Schuld gebe.

Das Thema Drei-Schichten-Modell ist hier sicher nicht ganz unangebracht, auch wenn die kontroverse Diskussion über Sinn und Unsinn bei "überschaubarer" Logik sicher nie enden würde.
Da es natürlich im Laufe eines Projektes immer mehr Methoden und Funktionen gibt ist sicher auch bei meinem Projekt auf lange Sicht diese Architektur sinnvoll und sollte sicher frühest möglich implementiert werden.
Irgendwie fallen mir zu diesem Thema, im Zusammenhang mit ASP.net MVC nur nicht die richtigen Suchbegriffe ein.
Bisher war ich davon ausgegangen, dass der Controller quasi die Logikschicht ist.
Das ist aber wohl ein Irrtum. Der Controller gehört dann wohl eher zur Präsentation.
Jetzt mal aus der Praxis, wie/wo implementiere ich denn die Businesslogik?
Ich meine, im einfachsten Fall gebe ich einer View einen Datensatz mit:

FunctionGroup functionGroup = db.FunctionGroups.Find(id);
return View(functionGroup);

Wie würde ich das denn mit einer zwischengeschalteten Logikschicht lösen?
Eine Trennung in drei Schichten macht schließlich nur Sinn, wenn ich sie konsequent überall einsetze.

23.01.2019 - 09:04 Uhr

So, damit hier keiner Amok läuft...
Ich programmiere hier eher hobbymäßig und muss mich nebenbei auch noch um andere Dinge kümmern.
Ich werde mir heute Eure Fragen und Anregungen nochmal genauer anschauen und Euch dann auch auf Stand bringen.
Was das drei-Schichten Modell angeht...
Ich habe mir ASP.NET MVC selbst beigebracht und habe es ganuso aus bezahlten Lernvideos gelernt.
Wie oder Wo soll ich denn jetzt nochmal den Controller in Logikschicht und Datenzugriffsschicht aufteilen?

Ja, die letzten beiden Codezeilen habe ich nicht kommentiert, hab ich übersehen.

Ja, es ging ursprünglich um den ersten Aufruf einer View, in anderen Foren bekommt man auf die Fresse, wenn man auch nur einen Threat Zuviel startet, hier ist es eben anders.
Danke dafür!

db ist in der Tat das EF DB Context, wird aber nirgends einer View übergeben, wer auch immer das behauptet.
Hier wird lediglich das Ergebnis eines Funktionsaufrufes an die View übergeben!

Alle anderen noch offenen Fragen werde ich beantworten, sobald ich sie beantworten kann.

Ach ja und MrSparkle, "Du hast einen Debugger und einen Profiler zur Verfügung, nutze sie!"
genau das war meine eigentliche Frage.

22.01.2019 - 15:23 Uhr

Hmm…
zu den Taskmanager-Daten hatte ich ja oben schon was geschrieben.
Es handelt sich um einen Virtuellen Server mit Windows Server 2012 Standard,
SQL Server 2012
2 virtuelle CPUs
3GB Ram
150GB Festplatte.

Das ist der Aufruf einer View, der beispielsweise rund 5 Sekunden dauert:


public ActionResult Edit(int id = 0)
        {
            if (id == 0)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            FunctionGroup functionGroup = db.FunctionGroups.Find(id);
            if (functionGroup == null)
            {
                return HttpNotFound();
            }
            
            ViewBag.ProjectName = functionGroup.Project.ProjectName;
            
            //Properties laden
            ViewBag.Properties = db.FunctionGroupProperties.AsNoTracking()
                .Where(a => a.FunctionGroupId == id)
                .OrderBy(a => a.ListPosition).ToList();

            //Funktionen laden
            ViewBag.Functions = db.Functions.AsNoTracking()
                .Where(a => a.FunctionGroupId == id)
                .OrderBy(a => a.ListPosition).ToList();

            TreeBuilder tb = new TreeBuilder();
            ViewBag.copyData = tb.GetFunctionTree(db);
            ViewBag.copyProperties = tb.GetPropertiesTree(db);
            return View(functionGroup);
        }

Ich finde die eigentlich jetzt nicht so spektakulär...
Wir reden hier bei Tabellen in der Größe von bisher vielleicht 400 Datensätzen.

22.01.2019 - 12:50 Uhr

Da hab ich keine Hardware für.
Gibt es denn im SQL Server nirgends irgendwelche Logs, mit denen man nachvollziehen kann was er so grade tut?

21.01.2019 - 12:39 Uhr

...ich muss diesen Threat nochmal rauskramen.

Der anfänglich verzögerte Start ist ja offensichtlich normal.
Ich habe nun also seit einiger Zeit eine erste Version der Datenbank produktiv und stelle fest, dass sie trotz geringster Datensatzanzahl quälend langsam geworden ist.
Die Datenbank hat der zeit keine 18MB und auch eigentlich keine ungewöhnlichen Beziehung.
Auf dem Developer-Rechner fluppt die Datenbank problemlos aber auf den Server ist das ganze Gebilde gähnend langsam.
Mein Problem ist, dass ich überhaupt keine Ahnung habe, wo ich mit der Suche beginnen soll.
Bin mit SQL-Server leider noch ziemlich unerfahren 😦

Wenn ich eine neue View öffne und demnach einen Datensatz abfrage geht die CPU Leistung kurzzeitig auf ca.85%, wobei hier der IIS worker-Prozess am meisten mit über 50% verbraucht.
Ich gehe aber eher davon aus, dass in der Konfiguration des SQL-Servers etwas nicht so richtig gut geklungen ist.
Wie geht Ihr an so eine Fehlersuche heran?

04.12.2018 - 11:17 Uhr

Ah jau verstanden...
Ich gebe die letzte, in der Produktiv-db veröffentlichte Migration an.

...wiederspricht zwar einem Tutorial, was ich dazu gefunden habe aber es klappt.
Das SQL-Script sieht zumindest gut aus.

Danke für den Tipp!

04.12.2018 - 10:52 Uhr

Ich weiß, was Du schreibst klingt logisch, sourceMigration sollte aber dennoch korrekt sein.
targetMigration sollte für Downgrades sein.
Ein Test mit Target, zeigt aber auch genauso wenig Erfolg.

update-database -script -TargetMigration:ListPositionAddedToProperties

Die Zieldatenbank weist bereits die Version 201812040833504_ListPositionAddedToProperties auf.

VS orientiert sich halt immer an der vorhandenen Datenbank sprich am entsprechenden Eintrag in der MigrationsHistory

04.12.2018 - 10:28 Uhr

Ich muss das Thema nochmal rauskramen.
Nachdem ich ja meine initiale Datenbank veröffenlicht habe, soll nun ein Update in der Produktivdatenbank erfolgen.
Optimistisch wie ich bin habe ich in der Paket-Manager-Konsole folgendes eingegeben:

update-database -script -SourceMigration:<Erste neue Migration>

Da ich dieses Update auf die lokale Datenbank natürlich schon angewendet habe bekomme ich die Meldung:

Keine ausstehenden expliziten Migrationen.

Womit sage ich dem update denn dass es sich um eine Migration für eine andere db handelt, damit es mir den SQL-Code generiert?

31.10.2018 - 15:59 Uhr

Ich muss gestehen, dass ich keine Ahnung habe, wie generische Klassen mit meinem Problem bzw. dessen Lösung kombinierbar sind.

Die Modelle existieren ja, also will ich die ja eigentlich nicht neu erzeugen, was ich doch mit einer generischen Klasse machen würde.

Ich fürchte das ist mir noch zu hoch, aber ich lese mich dazu mal noch etwas schlau...

31.10.2018 - 14:40 Uhr

Die Klassen sind alle Datenmodelle in ASP.NET Entity Framework.
Da muss ich ehrlich gesagt grade passen, ob das so einfach geht, ohne die CodeFirst-Migration zu ruinieren. Sorry, da fehlt mir noch etwas Wissen zu 😦

Aber ich werde mit dem Stichwort mal auf die Suche gehen. Danke.

31.10.2018 - 14:03 Uhr

Hallo Forum,
ich habe eine Frage zur Deklaration von Variablen.
Mein Problem ist, dass ich für einen Kopiervorgang eines Datensatzes je nach Auswahl des Benutzers aus 8 verschiedene Tabellen kopieren möchte.
Da der Aufbau der Tabellen in allen Fällen identisch ist, wäre es natürlich sinnvoll immer mit der gleichen Routine zu kopieren, also diese nicht acht mal zu schreiben.

Aktueller Stand (zwei Tabellen)


if (sourceType == FUNCTIONGROUPPROPERTY) 
{
    FunctionGroupProperty sourceData = db.FunctionGroupProperties.Find(sourceId);
    if (sourceData != null)
    {
        db.FunctionGroupProperties.Add(new FunctionGroupProperty()
        {
            FunctionGroupId = destinationId,
            byUser = user,
            DataTypeId = sourceData.DataTypeId,
            Column = sourceData.Column,
            Mandatory = sourceData.Mandatory,
            Name = sourceData.Name,
            Placeholder = sourceData.Placeholder,
            ReadOnly = sourceData.ReadOnly,
            Value = sourceData.Value,
            Visible = sourceData.Visible
        });
        db.SaveChanges();
        return "Eigenschaft '" + sourceData.Name + "' erfolgreich kopiert.\n";
    }
    return "Quelldaten nicht gefunden, Kopieren fehlgeschlagen.\n";
}
else if (sourceType == FUNCTIONPROPERTY)
{
    FunctionProperty sourceData = db.FunctionProperties.Find(sourceId);
    if (sourceData != null)
    {
        db.FunctionGroupProperties.Add(new FunctionGroupProperty()
        {
            FunctionGroupId = destinationId,
            byUser = user,
            DataTypeId = sourceData.DataTypeId,
            Column = sourceData.Column,
            Mandatory = sourceData.Mandatory,
            Name = sourceData.Name,
            Placeholder = sourceData.Placeholder,
            ReadOnly = sourceData.ReadOnly,
            Value = sourceData.Value,
            Visible = sourceData.Visible
        });
        db.SaveChanges();
        return "Eigenschaft " + sourceData.Name + "' erfolgreich kopiert.\n";
    }
return "Quelldaten nicht gefunden, Kopieren fehlgeschlagen.\n";
                        }

Das sollte möglichst später so aussehen:


if (sourceType == FUNCTIONGROUPPROPERTY)
    FunctionGroupProperty sourceData = db.FunctionGroupProperties.Find(sourceId);

else if (sourceType == FUNCTIONPROPERTY)
    FunctionProperty sourceData = db.FunctionProperties.Find(sourceId);
  
if (sourceData != null)
{
    db.FunctionGroupProperties.Add(new FunctionGroupProperty()
    {
        FunctionGroupId = destinationId,
        byUser = user,
        DataTypeId = sourceData.DataTypeId,
        Column = sourceData.Column,
        Mandatory = sourceData.Mandatory,
        Name = sourceData.Name,
        Placeholder = sourceData.Placeholder,
        ReadOnly = sourceData.ReadOnly,
        Value = sourceData.Value,
        Visible = sourceData.Visible
    });
    db.SaveChanges();
    return "Eigenschaft '" + sourceData.Name + "' erfolgreich kopiert.\n";
}
return "Quelldaten nicht gefunden, Kopieren fehlgeschlagen.\n";

Gibt es eine Möglichkeit sourceData hier quasi unbekannt zu deklarieren oder welchen Weg könnte man zur Vereinfachung gehen?

Gruß Carsten

10.10.2018 - 12:16 Uhr

Du hast Recht, sicher hat Jscript und CSS erstmal nichts mit ASP.NET zu tun.
Sorry für die Verwirrung.
Ich bin drüber gefallen, dass über das Scripts.Render einige Scripte und CSS-Files nicht geladen wurden.
Daraufhin hab ich alle Scripte und Styles erstmal manuell laden wollen.
Anscheinend habe ich mit der Reihenfolge der Scripte irgendwelche Wechselwirkungen erzielt.

Irgendwie verfließen die verschiedenen Technologien doch teilweise sehr stark miteinander.

Ich lasse in Zukunft einfach jeden Hinweis auf die von mir verwendete Technologie weg, dann kann es nicht falsch sein.
Dass es Web-Technologie ist, davon gehe ich aber weiter aus, wenn's Recht ist.

10.10.2018 - 11:35 Uhr

Hallo Forum,
ich verzweifle hier grade am Laden von Scripten und Styles.
Zunächst scheint es ja von essentieller Bedeutung zu sein, ob ein Script im <head> oder am Ende des <Body> geladen wird.
Woran kann ich erkennen, welches wo geladen werden muss?

04.10.2018 - 10:35 Uhr

Hallo nochmal...
ich habe mir einiges zu Canvas mit Netzwerken, aber auch Canvas als grafische Oberfläche angeschaut, stehe aber noch vor wenigen Fragen, auf die ich keine echte Antwort finde.

Da Netzwerk-Knoten anscheinend bei den gefundenen Projekten immer nur mittig im Knoten-Bild angebunden werden, kann ich diese Technik nicht direkt verwenden.
Ich muss bei einigen "Symbolen" zwei oder mehr Abgänge nebeneinander realisieren.
Also habe ich mir diverse Informationen zum direkten Grafik erstellen mit Canvas angeschaut.
Hier habe ich jetzt erstmal noch folgende Frage, die ich nicht selbst klären konnte.

  • wie füge ich am besten "Symbole" in eine Canvas-Fläche ein?
    Mir schwirrt dazu im Moment der Gedanke im Kopf herum eine Canvas Grafik direkt einzufügen, da ich dort definierte Punkte finden könnte, auf die man andere Symbole oder Linien andocken könnte.
    Ist das sinnvoll?
    Wenn ja, kann man dann irgendwie Gruppen an Canvas-Elementen bilden, die man als gesamtes verschieben oder positionieren kann?

  • gibt es zum andocken irgendwelche Techniken, die man direkt verwenden kann oder muss das alles zu Fuß im bestehenden Bild gesucht werden?

Denke ich überhaupt in die richtige Richtung?

Gruß Carsten

02.10.2018 - 11:58 Uhr

Na, das sind ja schonmal einige Stichwörter.
Dann will ich mal lesen.

Danke

02.10.2018 - 10:53 Uhr

Hallo Forum,
ich bin mit meinem ASP.NET MVC Projekt an einen neuen Kundenwunsch gestoßen, bei dem ich noch nicht genau weiß, wie bzw. womit ich ihn umsetzen soll.

Wie ja eingangs erwähnt handelt es sich um eine ASP.Net Anwendung.
Jetzt möchte ich eine Art Grafikeditor basteln der folgende Mindestanforderungen erfüllen soll:

-Vorgefertigte Grafik-Objekte (Symbole) platzieren, die eine Verbindung zur Datenbank brauchen (Also mindestens eine ID tragen müssen, besser noch andere Details) Also idealerweise Daten-Objekte darstellen sollen.
-Erstellung von Verbindungen zwischen diesen Objekten. Diese Verbindungen können (derzeit noch) komplett ohne Logik sein. Einfache Linien würden also reichen.
-idealerweise eine Art Andockfunktion und Raster für die Objekte, um sie aneinander zu reihen und für die "Verbindungen".
-Größe des Editor-"Blattes" möglichst "unendlich" und Symbole frei positionierbar.

Jetzt habe ich schon einiges gelesen aber für Webanwendungen bin ich da noch nicht wirklich fündig geworden.
Ich wäre also für jeden Tipp oder ein sinnvolles Suchwort dankbar.

Gruß Carsten

17.09.2018 - 09:45 Uhr

Also dann mal erst ein paar Randdaten:

Windows Server 2012 mit IIS und SQL-Server.
beim Laden der Index Seite wird lediglich das Layout mit Navbar und einer Sidebar geladen.
Der Inhalt der Sidebar ist dann allerdings, abhängig vom angemeldeten User bzw. bei nicht angemeldetem User gefüllt oder eben nicht. Hier hätte ich den einzigen Aufruf der vielleicht etwas Zeit kosten könnte. Das wäre dann aber "nur" die Information ob der User angemeldet ist und falls ja, welcher Usergruppe er angehört. Da die Ladezeit aber auch bei nicht angemeldetem User so hoch ist, kann der Aufbau der Sidebar schon nicht mehr die große Rolle spielen.
Das ganze geschieht mittels ASP.NET Identities.

Diese Telekom Navigationsseite taucht manchmal auf, wenn man von einem Telekom Anschluss aus eine unbekannte Seite öffnen will. Mega überflüssig aber ist halt so. Ich denke hier geht sie auf, weil zu lange kein Response kommt.

Abt, danke für den Tipp mit der Idle Time, da werde ich mal weitersuchen...

14.09.2018 - 14:51 Uhr

Hallo Ihr wissenden...
nun habe ich meine neue Site endlich online und muss feststellen, dass der erste Aufruf eines Views extrem lange dauert.
Am längsten dauert der initiale Aufruf des Home-Views.
Ich habe schon mit vorkompilieren veröffentlicht und dabei auch die option ‚allow precompiled site to be updated‘ deaktiviert, aber es ist so langsam, dass der Edge meint die Seite gäbe es gar nicht und auf Telekom Navigationshilfe weiterleitet.
Vom Safari aus dauert es beim ersten Aufruf etwa eine viertel Minute.
Danach dann höchstens eine Sekunde. Auch die weiteren Views, die dann auch Daten beinhalten brauchen maximal 1-2 Sekunden.

Wo fange ich da am besten an zu suchen?
Daten werden im Home-View gar nicht groß geladen aber ich denke mal die Verbindung zum SQL Server wird dort bestimmt schon aufgebaut?

Bin für jeden Hinwis dankbar.
Gruss Carsten

12.09.2018 - 12:31 Uhr

Die hier?

http://identityserver.io/

...ok, dann schaue ich da mal...

12.09.2018 - 09:41 Uhr

Also bei mir funktioniert das recht flüssig.
Ich habe die Registrierung neuer User den Administratorkonten vorenthalten.
Diese können dann über ein Dropdown die verfügbare Usergruppe auswählen.
Für meine Anwendung ist das in Ordnung.

Ne eigene Implementierung wäre dann mit dem erwähnten IdentityServer?
Gibt's da Lesestoff oder einen "best way" um gleich in die richtige Richtung zu laufen?

10.09.2018 - 15:45 Uhr

Hab es selbst gelöst bekommen.
Statt die erste Migration anzugeben musste 0 angegeben werden damit die "System" Tabellen mit generiert werden.

PM> Update-Database -Script -SourceMigration:0

Das erzeugt ein SQL Script, dass alle benötigten Tabellen, inklusive der Identity-Tabellen und der Migrations-Tabelle aufbaut.

Dann bleibt jetzt nochmal die Frage nach Identity.
Hier wurde in den Raum geworfen, dass das wohl nicht mehr gemacht würde.
Warum ist das so?
Ist das zu unsicher?

10.09.2018 - 11:02 Uhr

Ok...
also entweder habe ich mich undeutlich ausgedrückt oder ich bin einfach zu blöd.

Ich habe eine WebApp mittels Visual Studio, basierend auf ASP.NET MVC erstellt.
Dabei habe ich vom VS die Identites mit erstellen lassen.
Jetzt mal angenommen ich habe einen Windows Server und einen SQL-Server und möchte meine Seite dort hochladen... wie mache ich das?

Bisher habe ich einen Workflow gefunden bei dem ich die Site als File-Sortiment in ein lokales Verzeichnis erstellen lasse und dann diese auf den Server hochlade.
Um die SQL-Datenbank zu erstellen hat Migrations mir dafür ein SQL-Script generiert.
Jetzt nochmal die Frage, wann wird wo das Tabellensortiment erstellt, was Migrations offensichtlich nicht kennt (ASP-Identity-Tabellen und die _Migrationshistory-Tabelle).

Hab die Seite auf einen Azure MAPS-Account hochgeladen und soweit zumindest schonmal behaupten, dass sie fehlerfrei läuft.
Jetzt ist halt nur noch die Frage nach dem "normalen" Server.

Kann mir bitte jemand mit nem Link zu nem Tutorial helfen?

Das kann doch nciht so ein seltener vorgang sein.

07.09.2018 - 15:19 Uhr

schon diese Anweisung fehlschlägt:

INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])  

Gibt es eine Fehlermeldung?

Ich weiß die Meldung nicht mehr auswendig aber es gibt genau diese Tabelle [dbo].[__MigrationHistory] nicht.
Nochmal: das Skript zum Erzeugen der Tabellen wird vom VS erzeugt und enthält nicht die Tabellen, die es offensichtlich benötigt.
Der propagierte Workflow ist u.a., dass man alle notwendigen Dateien in ein Verzeichnis "erzeugen" lässt und für die Code-First Datenbank ein Skript generiert, mittels "update-database -script…"
Meine tollkühne Annahme war, dass dieses Wunderwerk Migrations dann bei einer neuen Datenbank allein auf die Idee kommt die Tabellen anzulegen, in die es rein schreiben will.

Hab ich da die falsche Reihenfolge?

Welche Reihenfolge meinst du?

na die Reihenfolge in der man die Veröffentlichung vornimmt.

Ich habe im SQL-Manager eine Datenbank angelegt und dann ganz optimistisch mittels einer neuen Abfrage die ersten SQL-Befehle ausgeführt. Das sollte doch stimmen oder?

Was sollte daran stimmen? Hat der Benutzer, den der EF in seinem ConnectionString verwendet, die erforderlichen Rechte oder nicht?

es geht doch noch gar nicht um Rechte. Auf was soll ich Rechte vergeben? Erst muss mal ne Datenbank da sein. Dann kommt die Website und die bekommt dann einen User im Connectionstring. Und ja, der braucht dann Rechte.
Aber so weit bin ich noch nicht. Ich habe lediglich gefragt, ob es der Richtige Weg ist die Datenbank mittels der SQL-Abfragen zu erstellen.

Aber egal, wie bekomme ich die denn jetzt angelegt? Von Hand?

Das hat doch Abt bereits erklärt.

Ach ja? hab ich was überlesen?
Ich hab nur gelesen dass Migrations offensichtlich nichts damit zu tun hat.
Gibt es denn jetzt einen anderen Weg oder mache ich alles zu Fuß?

07.09.2018 - 14:09 Uhr

Tja, wieso nutze ich die überhaupt noch?
Andere Frage, woher soll ich wissen, dass man die nicht mehr nutzt?
Und vor allem, was ist falsch daran?

Aber egal, wie bekomme ich die denn jetzt angelegt? Von Hand?
Da gehören ja sicher auch ein paar Einträge zu.

07.09.2018 - 13:40 Uhr

Ach und T-Virus,
ich habe jetzt dieses Identity-Gedöns mit durchgängiger Rechtevergabe implementiert, was Visual Studio beim Erstellen des Projektes ja schon mit einbaut.
Was muss denn jetzt noch davor gebastelt werden?

07.09.2018 - 13:11 Uhr

Also, wenn ich zum Beispiel die Migrations Tabelle sehen oder die Identitäten-Tabellen muss ich die doch irgendwie auf den SQL-Server bekommen.

Um eine App zu veröffentlichen kann ich mittels Azure sicherlich alles automatisch machen, auch das Entsorgen meines Geldes im Microsoft Schlund.
Habe ich aber einen eigenen Server, weiß ich bisher nur, dass ich die Website als Datei-Sammlung erstelle und dann die Datenbank mittels Script erstelle.
Das Script erstellt "update-database -script -Migrationname" dafür automatisch.
Es scheint sich dabei allerdings nur um die Tabellen zu handeln, die ich selbst angelegt habe, nicht die, die mit der ASP.NET MVC App angelegt werden 😦

...oder bin ich auf dem völlig falschen Pfad?

07.09.2018 - 09:20 Uhr

Hallo Forum,
mit meiner App möchte ich jetzt erste Veröffentlichungsversuche machen.
Dazu gehört unter Anderem ja auch das Veröffentlichen der Datenbank.

Dazu habe ich zwei Fragen:

  1. Wird im SQL Server ein eigener User angelegt damit sich die App dort verbinden kann? Den sa zu nehmen ist wohl nicht so ganz klug.
    Falls ja, welche rechte muss der User, sprich die App bekommen?
    Ich weiß, dass es sich dabei nicht um den Benutzer der App handelt.

  2. ich wollte die Datenbank per CodeFirst Script erstellen, stoße aber auf das Problem, dass zwar meine benötigten Tabellen im Script angelegt werden, die Tabelle MigrationHistory, sowie alle AspNet-Tabellen aber nicht und somit schon diese Anweisung fehlschlägt:

INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])

Hab ich da die falsche Reihenfolge?
Ich habe im SQL-Manager eine Datenbank angelegt und dann ganz optimistisch mittels einer neuen Abfrage die ersten SQL-Befehle ausgeführt. Das sollte doch stimmen oder?
Vielleicht kennt ja jemand ein gutes Tutorial zum Deployment auf MS-Server mit SQL Server.

Danke und Gruß
Carsten

05.09.2018 - 09:15 Uhr

ich wird bekloppt...

Hätte schwören können, dass ich das probiert hab.
🤔
AsNoTracking war mir bewusst, dass das nicht geht aber...

Naja, hab ich wohl doch nicht richtig probiert.
Danke 👍

04.09.2018 - 16:22 Uhr

verwendetes Datenbanksystem: SQL / LinQ / ASP.NET

Hallo Forum, ich brauche mal wieder einen Denkanstoß.
Ich muss ein paar Datensätze durchsuchen und abhängig vom Inhalt zur weiteren Verwendung zwischenspeichern.

Die erste Bedingung ist leicht zu erfüllen, ein bestimmtes Feld soll leer sein:


IEnumerable<SubFunction> subFunctionsToGenerate =
                db.SubFunctions.
                Where(x => x.Function.FunctionGroup.ProjectId == ProjectId &&
                ((x.IsOption && x.OptionPreselcted) || !x.IsOption) &&
                string.IsNullOrEmpty(x.Filter));

dieser Auflistung habe ich dann weitere Datensätze, nach Prüfung einiger Kriterien (mit denen SQL oder jede Where-Klausel überfordert wäre) weitere Einträge hinzugefügt:


if(…)
{
subFunctionsToGenerate = subFunctionsToGenerate.Concat(new[] { subfunction });
}

jetzt möchte ich diese Auflistung als Quelle für diese Abfrage benutzen:


List<SubFunction> subFunctions =
                        db.SubFunctions.
                        AsNoTracking().
                        Where(x => x.FunctionId == function.Id && 
                        !String.IsNullOrEmpty(x.Typical) && 
                        ((x.IsOption && x.OptionPreselcted) || !x.IsOption)).
                        OrderBy(x => x.ListPosition).
                        ToList();

Hier soll quasi db.SubFunctions gegen subFunctionsToGenerate ersetzt werden.

Ich hoffe ich hab einigermaßen erklären können worum es geht.

Mein Gedanke ist, es müsste eine virtuelle Datenbanktabelle sein, die man wie oben abfragen kann.
Gibt's sowas oder ist mein Ansatz völliger Unsinn?

Gruß Carsten

29.08.2018 - 14:56 Uhr

Hmm…
das Dictionary könnte klappen.
Auf die Idee Zeile und Spalte zu kombinieren bin ich nicht gekommen 🤔

Nun ja Performance...
Wenn ich schon den Nachmittag beim erzeugen der Tabelle vergeude könnte das herstellen der Daten aus der Datenbank je gern etwas schneller von Statten gehen 😉

Ich verwende ASP.NET MVC 5.2.6

Danke erstmal, da probiere ich mal etwas rum 🙂

PS: Danke für den Tipp mit ClosedXml. Ja, OpenXml ist gruselig!

29.08.2018 - 13:42 Uhr

Hallo Ihr Wissenden,
ich bin gar nicht sicher ob der Beitrag hier richtig ist.

Ich muss einige, verschachtelte Datensätze einlesen und aus ihnen eine Excel-Tabelle erzeugen.
Inhalt der Datensätze ist u.a. die Angabe in welcher Spalte ein Wert zu stehen hat.
Da diese Information erst beim Lesen der Datensätze ermittelt werden kann, ich aber eine Excel-Tabelle von links beginnend erzeugen sollte (Also nicht Spalte B bevor A erzeugt ist), wollte ich die Datensätze zunächst in einer virtuellen Tabelle anlegen.

Es müsste also eine Tabelle sein, deren Spaltenanzahl erweiterbar ist, auch wenn sie bereits Daten enthält.
Jetzt kann ich mir diverse mehrdimensionale Arrays ausdenken oder mit Recordsets arbeiten, vielleicht mehrere Dictionaries oder oder oder...

Welcher Weg, bzw. welches Objekt wäre hier zu empfehlen, vor allem von der Performance her?

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken.

Danke und Gruß
Carsten

28.08.2018 - 14:15 Uhr

...jetzt muss ich doch nochmal nachhaken.
Also Excel-Dateien erstellen und runter zu laden ist offensichtlich eher banal...

Bevor ich aber noch weiter suche (sind schon ein paar Stunden) eine Frage, die Ihr mir sicher direkt beantworten könnt.

Kann man aus einer ASP.NET MVC Anwendung auf eine bestehende Excel-Tabelle zugreifen?
Also öffnen, Daten austauschen und wieder schließen?

Danke
Gruß Carsten

27.08.2018 - 16:17 Uhr

Hallo Forum,
ich hab mal wieder nen Brett vor'm Kopf.
Ich möchte mittels Actionlink eine Funktion ausführen, die einen Wert aus einem Dropdown-Feld benötigt.
Jetzt ist dieser Wert natürlich vor dem Klicken auf den Link noch nicht abgespeichert, sprich das Model hat noch ungültige bzw. nicht gewählte Daten.
Wie kann ich direkt auf den aktull gewählten Wert zugreifen?


@Html.DropDownList("ProjectId", null, htmlAttributes: new { @class = "form-control" })


@Html.ActionLink("Projekt ausgeben", "Export", null,
                    new { ProjectId = Model.ProjectId },
                    new { @class="btn btn-secondary"})

Model.ProjectId funktioniert hier natürlich nicht.

Dank schonmal
Gruß Carsten

10.08.2018 - 14:54 Uhr

Danke, da schaue ich mal 😃

10.08.2018 - 14:43 Uhr

Hallo Forum,
mittels ASP.Net MVC werden in meiner App Datenbank-Tabellen gefüllt und bearbeitet.
Jetzt soll aus diesen Daten eine Excel-Tabelle gefüllt werden.
Problem ist, dass die Tabelle bereits existiert.
Ist es überhaupt möglich direkt in Excel-Tabellen zu schreiben?
Wenn ja, nach welchem Stichwort muss ich suchen?
Ich finde immer nur Export und Erzeugen neuer Dateien 😦

Gruß Carsten

06.08.2018 - 11:00 Uhr

Hmmm Tablettmodus nur bei Chrome?
Alle anderen Programme laufen ganz normal.
Kann man den bei Chrome gesondert einstellen?

Dieses Feature top-chrome-md habe ich mit Default und Normal sowie Touchable probiert, immer gleiches Verhalten.

03.08.2018 - 18:30 Uhr

danke für den Tipp.

Eine Frage off Topic, vielleicht weiss ja einer von Euch was darüber.
Seit einigen Tagen poppt jedes Mal wenn ich im Chrome ein eingabefeld focussiere eine Bildschirmtastatur auf.
Egal welche Seite geöffnet ist oder ob im Adressfenster und auch nur beim Chrome.
Diese komische Erweiterten Eingabetools sind nicht installiert.

03.08.2018 - 13:37 Uhr

Tatsächlich, scheint noch im Cache gewesen zu sein.

Danke, manchmal hat man ja nen Brett vorm Kopf ^^

03.08.2018 - 10:54 Uhr

Hallo Forum,
ich habe die letzten Tage verzweifelt versucht ein Treeview (jonmiles auf github) zu verändern.
Nachdem irgendwie nichts gefruchtet hat, habe ich die gesamte bootstrap-treeview.js leer gemacht.

Nach neu Erstellen der Projektmappe funktioniert das Treeview aber immernoch.
Ist das mittlerweile irgendwo direkt in Bootstrap implementiert?

Eine bootstrap-treeview.min.js existiert nicht, kann also auch nicht Schuld sein.

Wo kann sich denn das zugehörige Script noch verstecken?

27.07.2018 - 11:23 Uhr

Hallo emuuu,
danke für Deine Hilfe.
Ich hab es jetzt erstmal mit dem "eingebetteten" Modal-View gelöst und das partial view vorerst beiseite gelegt.

Beim nächsten Modal-Dialog werde ich es nochmal probieren und dann ggf. nochmal hier landen 😉

Also Danke nochmal...

27.07.2018 - 09:49 Uhr

Ich bin mir schon recht sicher, dass es nicht geladen wird, da die zugehörige Action nie erreicht wird.

Mittlerweile glaube ich einen Ansatz gefunden zu haben.
Offensichtlich ist das (nach-)Laden eines Views seit Bootstrap 3.3 nicht mehr direkt supported:

It is important to note here that Bootstrap version 3.3 deprecated the auto fetch feature and some additional JavaScript will be needed once it is removed. In earlier versions, however, it handles everything for you. The reason version 3.3 removes the capability was that they determined it was out of scope for what is primarily a CSS framework. You can read more about the issue
>

Aber ich fürchte das ist noch viel zu hoch für mich.
Ich finde da überhaupt keinen Ansatz wie ich weiter kommen könnte 😦

26.07.2018 - 14:59 Uhr

Hallo Forum,
ich habe das Internet bisher erfolglos nach einer Lösung für mein Problem durchsucht und unzählige Beispiele ausprobiert.
Zuletzt dieses hier:
https://amlblog.net/programming/2016/04/25/bootstrap-modals-and-razor.html

Ich möchte einen Auswahldialog mittels ActionLink und zugehöriger Action starten.
Problem ist im Augenblick eigentlich, dass das partialView nicht geladen wird, sobald data-toggle = "modal" übergeben wird.

ActionLink:


@Html.ActionLink("kopieren", "CopyDialog", "Projects",
    new { Id = Model.Id },
    new
    {
        @class = "btn btn-secondary",
        data_target = "#modal-container",
        data_toggle = "modal"
    })

Action:

public ActionResult CopyDialog(int Id)
        {
            ViewBag.Id = Id;
            return PartialView("_CopyDialog");
        }

und das View:

<div id="modal-container" class="modal fade hidden-print" tabindex="-1" role="dialog">
    <div class="modal-dialog">

        <div class="modal-header">
            <h4>Funktionsgruppe aus Vorlage kopieren</h4>
            <a href="#" class="close" data-dismiss="modal">&times;</a>

        </div>

        <div class="modal-content">
            CONTENT
            @ViewBag.Id
        </div>

        <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Abbruch</button>
            <button type="button" class="btn btn-default" data-dismiss="modal">OK</button>

        </div>
    </div>
</div>

Lasse ich beim ActionLink data_toggle = "modal" weg, wird das View (natürlich ohne Layout-View) geladen.
Was mache ich falsch?

Gruß Carsten

14.07.2018 - 08:18 Uhr

Hallo Taipi,
Genau die Struktur, die Du da aufzählst habe ich ja.
Es geht hier lediglich darum die erste Ebene in einem nem Treeview darzustellen.
Meine aktuelle Struktur sieht so aus:

Funktionsgruppen
—Eigenschaften
— Funktionen
——Eigenschaften
——Unterfunktionen
———Eigenschaften
———Makros
————Eigenschaften

Hier nochmal eine drei- oder vierstufige Schachtelung vor zu schalten führt eher zu mehr Fragen als zu Komfort.
Es handelt sich hier im übrigen um eine Engineering Datenbank die tatsächlich nur von sehr wenigen Bearbeitern verwendet wird.
Vielleicht baue ich später noch eine Art selbst erweiterndes Dropdown-Menü dazu damit bereits benutzte Phrasen vorgeschlagen werden.

Nun denn, in ein XML habe ich die Hierarchie mittlerweile übergeben können.
Jetzt bin ich grade beim Treeview.

Gruß Carsten