Autor Beitrag
Schafschaf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63
Erhaltene Danke: 2

Windows 10
C# (VS 2015)
BeitragVerfasst: Do 17.09.15 15:13 
Hallo Leute,

ich bin auf 180! :x

Ich habe einen WCF Dienst mit Entity Framework hintendran.
Jetzt habe ich unter Anderem eine 1:n Verknüpfung, bei denen ja jedes Objekt ein Anderes als Property hat.
Als Beispiel nehme ich mal Mensch und Autos. Ein Mensch kann nur in einem Auto sitzen.
Jetzt will ich für meine XAML App (die der Client ist) die Daten abholen.
Dafür habe ich eine Methode im WCF:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
        public List<Mensch> LoadMenschen()
        {                     
            using (TestContext context = new TestContext())
            {
                return context.Menschen.Include("Auto").ToList();
            }           
        }



Wenn ich jetzt das "Include" weglasse, bekomme ich eine Liste von Menschen, bei denen "Auto" null ist. Das bringt mir nix.
Nehme ich das Include, ist zwar das Auto da, aber ich bekomme im Client eine Fehlermeldung :
"Fehler beim Empfangen der HTTP-Antwort für host:port/Dient. Die Ursache kann sein, dass die Dienstendpunktbindung kein HTTP-Protokoll verwendet. Eine andere mögliche Ursache ist, dass der HTTP-Anforderungskontext vom Server abgebrochen wird (vermutlich auf das Herunterfahren des Diensts zurückzuführen). Weitere Informationen finden Sie in den Serverprotokollen."
(Die gleiche Fehlermeldung bekam ich auch, als ich statt einer Liste eine IEnumerable zurückgeben wollte)

Und, wenn ich ohne EF im der Methode einfach mal so eine neue Liste erstelle vom Typ Mensch und da einfach mal was zuweise und ein paar Autos zuweise, funktioniert es. Mit der Liste aus EF nicht.

Wollen die mich fertig machen? :(

Hoffe jemand kann mir sagen an was das liegt.


Moderiert von user profile iconTh69: Topic aus Sonstiges (.NET) verschoben am Do 17.09.2015 um 18:22
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4456
Erhaltene Danke: 919


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 17.09.15 20:12 
Hat wohl offensichtlich nix mit EF zu tun sondern ist ein reines WCF Problem. Das hast du aber schnell selbst ausprobiert wenn du die Methode mal einfach ohne WCF direkt aufrufst.
Um beim WCF Problem zu helfen müssten wir aber mindestens die Konfiguration des Endpoints (am Besten Client und Server) sehen.
Schafschaf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63
Erhaltene Danke: 2

Windows 10
C# (VS 2015)
BeitragVerfasst: Fr 18.09.15 09:30 
Habe es mal im Service ausprobiert, funktioniert ohne Probleme, weil der ja mein DbContext kennt.
Meine App.config sieht so aus:
Im Client habe ich eigentlihc gar nix gemacht. Einfach nur Dienstverweis hinzugefügt und fertig.

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="MetaInformation">
                    <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8500/MetaInfo"
                        httpsGetBinding="" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="MetaInformation" name="DataObjects.EntityFunctions">
                <endpoint address="http://localhost:8500/Service" binding="basicHttpBinding"
                    bindingConfiguration="" contract="DataObjects.EntityFunctions" />
            </service>
        </services>
    </system.serviceModel>


Nach ein bisschen Recherche habe ich das hier gefunden:
www.entwickler-ecke....bjekte_111200,0.html

Der hatte ein ähnliches Problem.
So wie es da ausssieht, kann man die Objekte, die aus dem context kommen nicht im WCF übertragen.
Deshalb hats auch geklappt als ich ohne Context was übertragen konnte.
Die Lösung auf die ihr da gekommen seid gefällt mir aber nicht. Muss ich wirklich alle Daten, die ich übertrage nochmal mappen?
Ich habe teilweise Tabellen mit sehr vielen Spalten, da mappe ich mir ja nen Wolf.
Gibts keine Möglichkeit eine Liste, die ich aus dem context habe komplett vom EF zu lösen?
Habe es schon mit der "AsNoTracking" Methode veruscht, ohne Erfolg :(
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4456
Erhaltene Danke: 919


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 18.09.15 11:27 
Zitat:
Gibts keine Möglichkeit eine Liste, die ich aus dem context habe komplett vom EF zu lösen?

Working with POCO Entities

Zitat:
Die Lösung auf die ihr da gekommen seid gefällt mir aber nicht. Muss ich wirklich alle Daten, die ich übertrage nochmal mappen?


Du kannst probieren auch ohne auszukommen. Zum Beispiel indem du EF mit POCO Objekten verwendets. Da habe ich aber zu wenig Erfahrung um zu sagen ob das gut/schlecht funktioniert.
Im allgemeinen Fall ist Mapping eine gängige Lösung um Techniken voneinander zu trennen. Gehört somit in den Standard Entwicklerwerkzeugkasten.

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.

Für diesen Beitrag haben gedankt: Schafschaf
Schafschaf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63
Erhaltene Danke: 2

Windows 10
C# (VS 2015)
BeitragVerfasst: Mo 21.09.15 14:56 
Zitat:

Im allgemeinen Fall ist Mapping eine gängige Lösung um Techniken voneinander zu trennen. Gehört somit in den Standard Entwicklerwerkzeugkasten.


Da hast schon Recht, das Entity Framework ist aber nur dafür da um den Client mit Datan aus der Datenbank zu bedienen, daher ist mir das einfach zuviel Umstand.
Habs jetzt anders gelöst, ich kann dem WCF sagen, dass er die Finger von den Referenzen in den Entitäten lassen soll, hab ich durch Rumprobieren rausgefunden:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
[DataContract(IsReference = true)]
    public class Mensch
    {        
        [DataMember]
        public int MenschId { get; set; }

        [DataMember]
        public string Name { get; set; }

        ...
    }