Ошибка 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();


при использовании отлаживая, он находит объекты из базы данных, однако он не возвращает объекты.



любые идеи о том, где я могу ошибаться?

488   3  

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

    Ничего не найдено.