56 votes

Erreur DataContractSerializer lors de l'utilisation d'Entity Framework 4.0 avec WCF 4.0

Je suis tenter de récupérer une liste d'objets à partir d'Entity Framework via WCF, mais je suis la réception de l'exception suivante:

Il y avait une erreur lors de la tentative de sérialiser paramètre http://tempuri.org/:GetAllResult. Le InnerException message a été 'Type 'System.Data.Entity.DynamicProxies.TestObject_240F2B681A782799F3A0C3afbe4a67a7e86083c3cc4a3939573c5410b408ecce " avec les données de nom de contrat 'TestObject_240F2B681A782799F3A0C3afbe4a67a7e86083c3cc4a3939573c5410b408ecce:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies " n'est pas prévu. Envisagez d'utiliser un DataContractResolver ou ajouter tous les types pas connu statiquement à la liste des types connus - par exemple, en utilisant la KnownTypeAttribute attribut ou en les ajoutant à la liste des types connus passé à DataContractSerializer.'. Veuillez voir InnerException pour plus de détails.

J'ai utilisé de la WCF dans le passé, mais jamais avec Entity Framework. J'ai toutes mes entités générées via Entity Framework et sont annotés avec [DataContract] et [DataMember] attributs. Je n'ai pas de Propriétés de Navigation sur un de mes entités.

Le GetAll() la méthode appelée est dans un résumé à la classe de service:

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

Et je suis en utilisant le ChannelFactory d'appeler mon application:

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();
}

Je suis d'hébergement en tant que tel:

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();

Lors de l'utilisation de débogage, il trouve les objets de la base de données, cependant, il est à défaut de retourner les objets.

Toutes les idées quant à l'endroit où j'ai peut-être tort?

92voto

Brandon Points 2728

C'était difficile à comprendre, mais c'est parce qu'EntityFramework crée un "proxy" de votre classe. La classe TestObject que j'avais était configurée correctement, mais elle créait une classe appelée: TestObject_240F2B681A782799F3A0C3AFBE4A67E7608C3CC4A3939573C5410B408ECCE

Pour que ChannelFactory + WCF + Entity Framework fonctionne correctement, vous devez vous rendre dans votre constructeur de contexte et ajouter les éléments suivants:

 ContextOptions.ProxyCreationEnabled = false;
 

J'espère que ça aidera quelqu'un d'autre.

60voto

a-h Points 693

Lors de l'utilisation de l'API DbContext pour Code First (EF 4.3), je devais faire:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X