Errore DataContractSerializer che utilizza Entity Framework 4.0 con WCF 4.0

.net entity-framework

Domanda

Sto tentando di recuperare un elenco di oggetti da Entity Framework tramite WCF, ma sto ricevendo la seguente eccezione:

Si è verificato un errore durante il tentativo di serializzare il parametro http://tempuri.org/:GetAllResult . Il messaggio era InnerException 'Tipo 'System.Data.Entity.DynamicProxies.TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE' con il nome del contratto di dati 'TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies ' non è previsto. Prendi in considerazione l'utilizzo di DataContractResolver o aggiungi staticamente i tipi non noti all'elenco dei tipi noti, ad esempio utilizzando l'attributo KnownTypeAttribute o aggiungendoli all'elenco dei tipi noti passati a DataContractSerializer. '. Si prega di consultare InnerException per maggiori dettagli.

Ho usato WCF in passato, ma mai con Entity Framework. Ho tutte le mie entità generate tramite Entity Framework e sono annotate con gli attributi [DataContract] e [DataMember]. Non ho proprietà di navigazione su nessuna delle mie entità.

Il metodo GetAll () chiamato è in una classe di servizio astratta:

[ServiceContract]
public interface IService<T>
{
    [OperationContract]
    List<T> GetAll();
}

E sto usando ChannelFactory per chiamare la mia implementazione:

Binding binding = new NetTcpBinding();
EndpointAddress endpointAddress = new EndpointAddress("net.tcp://localhost:8081/" + typeof(TestObjectService).Name);
using (ChannelFactory<ITestObjectService> channel = new ChannelFactory<ITestObjectService>(binding, endpointAddress))
{
    ITestObjectService testObjectService = channel.CreateChannel();
    testObjects = testObjectService.GetAll();
    channel.Close();
}

Lo sto ospitando come tale:

Type type = typeof(TestObjectService);
ServiceHost host = new ServiceHost(type,
            new Uri("http://localhost:8080/" + type.Name),
            new Uri("net.tcp://localhost:8081/" + type.Name));
host.Open();

Quando si utilizza il debug, trova gli oggetti dal database, ma non riesce a restituire gli oggetti.

Qualche idea su dove potrei andare storto?

Risposta accettata

Questo era un problema da capire, ma è perché EntityFramework crea un "proxy" della tua classe. La classe TestObject che avevo era impostata correttamente, ma stava creando una classe chiamata: TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE

Per far funzionare insieme ChannelFactory + WCF + Entity Framework, devi entrare nel tuo costruttore di Context e aggiungere quanto segue:

ContextOptions.ProxyCreationEnabled = false;

Spero che questo aiuti qualcun'altro.


Risposta popolare

Quando si utilizza l'API DbContext per Code First (EF 4.3) ho dovuto fare:

public class MyClass : DbContext
{
    public MyClass()
    {
        base.Configuration.ProxyCreationEnabled = false;
    }
}


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow