DataContractSerializer Erreur à l'aide de 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 du contrat nom de" 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.
La 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 de mise en œuvre:
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.
Des idées quant à l'endroit où j'ai peut-être tort?
Vous devez vous connecter pour publier un commentaire.
C'était une douleur à la figure, mais c'est parce que EntityFramework crée un "proxy" de votre classe. Le TestObject classe que j'avais a été configuré correctement, mais il était de créer une classe appelée: TestObject_240F2B681A782799F3A0C3afbe4a67a7e86083c3cc4a3939573c5410b408ecce
Pour faire de la ChannelFactory + FMC + Entity Framework travailler tous ensemble, vous devez aller dans votre Contexte constructeur et ajoutez les éléments suivants:
J'espère que cela aide quelqu'un d'autre.
DirectCast(Me, IObjectContextAdapter).ObjectContext.ContextOptions.ProxyCreationEnabled = False
this.Configuration.ProxyCreationEnabled = false;
. Fonctionne comme un champion maintenant!Lors de l'utilisation de l'API DbContext pour le Premier Code (EF 4.3) que j'avais à faire:
Pour EntityFramework 6.0 j'ai dû changer de configuration ainsi:
Vous avez plusieurs autres options en plus de l'ajout d'un proxy pour l'ensemble de votre POCO:
1) Créer un wrapper. Dans une API, il est probable que vous ne voulez pas exposer l'ensemble de la POCO à vos utilisateurs... afin de créer un objet wrapper qui expose les trucs que vous voulez, et aussi, cela résout le problème de proxy.
1.5) à peu près comme 1, mais au lieu de créer un wrapper, il suffit de revenir un
anonymous type
(avecLINQ
)2) Si vous n'avez pas besoin de faire application de large, il peut être plus judicieux de le faire dans le
Controller
où vous avez besoin que la sérialisation... ou même plus localisée à unMethod
, y comprisusing
, voici un parController
mise en œuvre:3) L'autre chose est que si vous êtes dans le besoin juste pour que db appel, la meilleure façon de le faire est de la chaîne
AsNoTracking()
votre appel:Place, vous pouvez utiliser un DTO et de retour que. Pas besoin de désactiver la propriété Proxycreationenabled la valeur.