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

.net entity-framework

Question

J'essaie de récupérer une liste d'objets à partir d'Entity Framework via WCF, mais je reçois l'exception suivante:

Une erreur s'est produite lors de la tentative de sérialisation du paramètre http://tempuri.org/:GetAllResult . Le message InnerException était « Type « System.Data.Entity.DynamicProxies.TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE » avec le nom de contrat de données « TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies » est pas prévu. Envisagez d'utiliser un DataContractResolver ou d'ajouter des types non connus statiquement à la liste des types connus, par exemple, en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus transmis à DataContractSerializer. Veuillez consulter InnerException pour plus de détails.

J'ai déjà utilisé WCF par le passé, mais jamais avec Entity Framework. Toutes mes entités sont générées via Entity Framework et annotées avec les attributs [DataContract] et [DataMember]. Je n'ai aucune propriété de navigation sur aucune de mes entités.

La méthode GetAll () appelée est dans une classe de service abstraite:

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

Et j'utilise ChannelFactory pour appeler mon implémentation:

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 l'héberge comme 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 du débogage, il trouve les objets de la base de données, mais ne renvoie pas les objets.

Des idées quant à l'endroit où je peux me tromper?

Réponse acceptée

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.


Réponse populaire

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow