Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie kann ich Daten über einen Webservice (ASMX) und EF 6 abspeichern?
Platoon
myCSharp.de - Member



Dabei seit:
Beiträge: 46
Herkunft: NRW

Themenstarter:

Wie kann ich Daten über einen Webservice (ASMX) und EF 6 abspeichern?

beantworten | zitieren | melden

verwendetes Datenbanksystem: <MSSQL>

Hallo zusammen,

ich bin gerade dabei eine Erweiterung für meine Applikation zu schreiben. Ziel ist es sowohl die Daten direkt in den SQL Server zu schubsen - sprich ohne Webservice und zum anderen die Möglichkeit zu schaffen die Daten über einen Webservice (ASMX) wegzuschreiben.

Die erste Methode zum erhalten von Daten wurde schon erstellt und das funktioniert auch. Daten werden abgerufen und auch dargestellt.

Wie bekomme ich es denn jetzt hin, dass ich das Model über den Webservice ändere?
Der Changetracker würde doch da nicht greifen denke ich, weil die Objekte sich ja durchaus unterscheiden können.

Ich habe da ehrlich gesagt keinen Anhaltspunkt und wäre über einen kleinen Rat sehr Dankbar.

Ich könnte hergehen und jedes Element mit dem Model vergleichen aber das nutzt mir ja Prinzipiell erstmal null weil es die Performance bei größeren Datenmengen in den Keller ziehen würde.

Habe das mal mit DataTables gemacht und da tatsächlich alles auf Änderungen überprüft aber das ist mir beim EF nicht zielführend.

Die Daten kommen als JSON vom WebService und ich würde diese auch als JSON wieder zurückschieben wollen.

Hoffe, es ist nicht zu Wirr und jemand hat eine Idee (vllt. Reflections?).

Lg,
Dom
.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1820
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

ASMX ist eigentlich total veraltet.
Heute nimmt man dafür WebAPI.
Diese ist REST basiert und dürfte deinen Anforderungen entsprechen.

Nutzen wir bei uns als API zur Import/Export von Daten und nutzen dafür Json als Datenformat.
Wie du die Daten dann innerhalb deiner Verarbeitung nutzt ist aus deinem Posting nicht ganz klar.
Hier müsstest du mal ein Beispiel liefern.

Ansonsten solltest du auch auf DataTable verzichten, das ist unperformant.
Wenn du schon EF nutzt, dann nutze doch deine Entitäten.
Hier musst du wahrscheinlich deine Daten eh transformieren, da deine API vermutlich nicht 1:1 die Daten der Tabelle(n) wieder gibt.
Auch sollte die Api ihre eigenen Datenmodelle anbieten, die alle nötigen Eigenschaften mitbringen.

WebAPI

T-Virus
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Platoon
myCSharp.de - Member



Dabei seit:
Beiträge: 46
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

Ich werde mir die WebApi-Geschichte mal ansehen - danke schon mal dafür.

Ich nutze momentan keine DataTables - habe ich mal genutzt ist aber schon lange her.

Die Nutzung schaut so aus:

Ich hole mir z.B. Daten aus einer Tabelle BLZ. Diese Tabelle beinhaltet Infos zu Bankleitzahlen, BICS, PLZ usw. also Bankinfos.

Das Model ist dem Webservice bekannt und auch der Applikation. Ich hole die Infos über den Webservice (exemplarisches Beispiel):

       
 [WebMethod]
    
        public string GetBanks()
        {
            return JsonConvert.SerializeObject(new bankingQueries().GetBanks());
        }

Die Daten werden dann als ObservableCollection<BLZ> deserialisiert.


var banks = JsonConvert.DeserializeObject<ObservableCollection<BLZ>>(_banksResult);

Das Property Banks bekommt dann banks zugewiesen - Daten werden angezeigt.

Wenn ich nun eine Änderung durchführe muss das Model auf der Webservice Seite (egal in welcher Hinsicht) ja mitbekommen - sofern ein Speichern angestoßen wird, dass es eine Änderung gegeben hat - und genau da fehlt es gerade.

Ich könnte jetzt hergehen und bei dieser Vorgehensweise noch eine Property hinzufügen, die den aktuellen Status mitteilt. Das nutzt mir aber nicht viel wenn die Software im Multiuser Betrieb betrieben wird weil es ja dann zu Integritätsverletzungen kommen kann und auch kommen wird.

Dann müsste ich allerdings mit Transactions arbeiten - was grundsätzlich nicht schlimm ist aber in den allermeisten fällen berühre ich bei Änderungen max. 2 Tabellen.

Ich muss dazu sagen, dass es sich bei der Anwendung nicht um eine Web-App handelt sondern um eine WPF Anwendung.

Danke schon mal an dich für die Antwort :-).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Platoon am .
.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1820
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Über WebAPI bildest du dies ja via REST ab.
Entsprechend hast du einen Controller, der die dann entsprechende Operationen bereitstellt.

Hier müsstest du dann z.B. mit POST den Eintrag zurück an die API schicken, damit diese in der DB geupdatet wird.
Eine entsprechende GET Methode liefert dir dann die entsprechenden Einträge.
Gerade für diesen Anwendungszweck wirst du mit der WebAPI besser fahren als mit den klobigen ASMX SOAP Webservices.
Hier müsstest du sonst zum updaten eine eigene Methode anlegen, diese im Client über Service Reference Update bekannt machen und aufrufen.
Ist aber sehr unelegant und wie gesagt ist ASMX auch nicht mehr der Stand der Dinge.

Die De-/Serialisierung übernimmt die WebAPI dann auch für dich, siehe Tutorial.
Nur im Client musst du dann den Http(s) Response deserialisiern, was aber kein Problem ist.
Kann man z.B. mit einer einfachen Extention Method für String lösen.

Wenn dein Datenmodell sauber ist, sollte es auch keine Probleme geben.
Hier müsste man aber wissen was in BLZ drin steht und was die jeweiligen Zugehörigkeiten zu den Tabellen ist.
I.d.R. sollte dein Datenmodell auch den Key zum updaten liefern, damit man eben gezielte Updates machen kann.

Mir ist aber nicht klar warum die Kollissionen bei deinem Multiuser Betrieb siehst.
Wenn es hier Probleme gibt, dann vermutlich zu recht.
Die Konflikte musste du dann über die Api zurück melden.
Dafür gibt es dann die entsprechenden Status Codes und falls nötig ein Response Objekt mit entsprechenden Informationen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Platoon
myCSharp.de - Member



Dabei seit:
Beiträge: 46
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

Vielen Dank für dein Feedback.

Ich schau mir die WebAPI mal an und werde das entsprechend darüber abbilden - sieht erheblich komfortabler aus als die SOAP Mimik und scheint tatsächlich deutlich mehr Sinn zu machen. Sieht auf den ersten Blick deutlich besser aus :-).

Die BLZ war nur ein Beispiel (da sind halt allgemeine Bankinfos hinterlegt --> kommen von der Bundesbank).

In der Theorie können keine Kollisionen entstehen da die Datensätze zum einen Versioniert sind und zum anderen meistens Benutzern direkt zugewiesen sind - aber man weiß ja nie :-).

Zur Erklärung der Applikation:

Ich baue mir und meiner Familie eine Anwendung wo ich Dokumente speichere (quasi ein Lightweight DMS), Finanzen verwalte (auch Lightweight inkl. CAMT Import), E-Mails archiviere und Termine verwalte.

Das mache ich zum einen aus Lerngründen und zum anderen erspart es einfach eine Menge an Arbeit (x Programme für n Zwecke).
.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15695
Herkunft: BW

beantworten | zitieren | melden

"WebAPI" ist ein Produktname von Microsoft, der Teil von ASP.NET (Classic) war und mit WebAPI2 vor ca. 7 Jahren auch sein Ende gefunden hat. Wenn man das googelt, dann bekommt man sehr oft altes Zeug gezeigt.

Was technologisch hier der richtige Weg wäre, wäre eine HTTP API über REST oder gRPC.
Der aktuelle Produktname in der Microsoft Welt ist ASP.NET Core.
private Nachricht | Beiträge des Benutzers
Platoon
myCSharp.de - Member



Dabei seit:
Beiträge: 46
Herkunft: NRW

Themenstarter:

beantworten | zitieren | melden

Merci Abt - das klingt genau nachdem was ich mir vorstelle.

Ich hab mir den Link schon angeschaut und da wird ja nun auch das abgebildet, was ich brauche.

Vielen Dank dafür. Wie immer - gute und schnelle Hilfe.
.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....
private Nachricht | Beiträge des Benutzers