Ошибка DataContractSerializer при использовании Entity Framework 4.0 с WCF 4.0
Я пытаюсь получить список объектов из Entity Framework через WCF, но получаю следующее исключение:
произошла ошибка при попытке сериализации параметра http://tempuri.org/:GetAllResult. сообщение InnerException было системой 'Type'.Данные.Сущность.Динамические процессы.TestObject_240F2B681A782799F3A0C3afbe4a67a7e86083c3cc4a3939573c5410b408ecce ' с именем контракта данных 'TestObject_240F2B681A782799F3A0C3afbe4a67a7e86083c3cc4a3939573c5410b408ecce:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies- не ожидается. Рассмотрите возможность использования DataContractResolver или добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, передаваемых в DataContractSerializer.'. Пожалуйста, см. свойство innerexception для более подробной информации.
у меня есть используется WCF в прошлом, но никогда с Entity Framework. У меня есть все мои сущности, созданные с помощью Entity Framework и аннотированные атрибутами [DataContract] и [DataMember]. У меня нет свойств навигации ни на одном из моих объектов.
вызываемый метод GetAll () находится в абстрактном классе обслуживания:
[ServiceContract]
public interface IService<T>
{
[OperationContract]
List<T> GetAll();
}
и я использую ChannelFactory для вызова моей реализации:
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();
}
Я принимаю его как таковой:
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();
при использовании отлаживая, он находит объекты из базы данных, однако он не возвращает объекты.
любые идеи о том, где я могу ошибаться?
3 ответов:
Это было больно понять, но это потому, что EntityFramework создает "прокси" вашего класса. Класс TestObject, который у меня был, был настроен правильно, но он создавал класс с именем: TestObject_240F2B681A782799F3A0C3afbe4a67a7e86083c3cc4a3939573c5410b408ecce
чтобы заставить ChannelFactory + WCF + Entity Framework работать вместе, вы должны войти в свой конструктор контекста и добавить следующее:
ContextOptions.ProxyCreationEnabled = false;Я надеюсь, что это поможет кому-то еще.
при использовании DbContext API for Code First (EF 4.3) я должен был сделать:
public class MyClass : DbContext { public MyClass() { base.Configuration.ProxyCreationEnabled = false; } }
для EntityFramework 6.0 мне также пришлось изменить конфигурацию:
public class MyContext : DbContext { public MyContext() : base("name=MyContext") { Configuration.ProxyCreationEnabled = false; } }
Comments