by Israr Khan
22. desember 2010 11:20
Testet ut EF4, Poco og WCF? Fått en feilmelding av følgende type:
Receivera:InternalServiceFaultCannot serialize parameter of type 'System.Data.Entity.DynamicProxies.FOO' (for operation 'GetFoo', contract 'FooService') because it is not the exact type 'Model.Foo' in the method signature and is not in the known types collection. In order to serialize the parameter, add the type to the known types collection for the operation using ServiceKnownTypeAttribute
Lagt merke til at objektene som er virtuelle blir definert som Proxy-Typer? Dette betyr at selv om basen består av ditt POCO-objekt, vil det under runtime bli generert et dynamicProxy-object, som ikke gjenspeiler ditt objekt direkte(men det gjør det indirekte som følge av at basen består av ditt poco-object). Dette skaper problemer når du skal serialisere disse objektene ut i pipen, hente ut attributter, kjøre reflection og siden proxy-typene heller ikke er known types, må disse behandles korrekt, enten ved å opprette en egen DataContractResolver, eller ved å skru av ProxyCreation.
Så perfekt - burde vært enkelt? Tja: Sjekk ut release notes for CTP5:
DbContext.ObjectContext has moved:
Rather than being a protected member we have made the underlying ObjectContext available via an explicitly implemented interface, this allows external components to make use of the underlying context. Getting the context now looks like: ((IObjectContextAdapter)myContext).ObjectContext
Så DbContext har ingen direkte property hetende ObjectContext. Så bruk ((IObjectContextAdapter)myContext).ObjectContext for å få tilgang til ObjectContext-en for å skru av ProxyCreation.
Sjekk ut:
http://msdn.microsoft.com/en-us/library/ee705457.aspx, Walkthrough: Serialize POCO Proxies with WCF
http://msdn.microsoft.com/en-us/library/dd456853.aspx , Working with POCO Entities.
http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-released.aspx , Release notes for CTP5