DataContractSerializer错误使用实体框架4.0与WCF 4.0如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我试图通过WCF从实体框架中检索对象列表,但我收到以下异常:

尝试序列化参数http://tempuri.org/:GetAllResult时发生错误。该消息的InnerException是“类型‘System.Data.Entity.DynamicProxies.TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE’数据合同名称‘TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies预计不会’。考虑使用DataContractResolver或将任何不知道的类型静态添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。有关更多详细信息,请参阅InnerException。

我过去使用过WCF,但从来没有使用过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();

使用调试时,它会从数据库中查找对象,但是它无法返回对象。

任何关于我可能出错的想法?

提问于
用户回答回答于

这是一个很难解决的问题,但这是因为EntityFramework会为您的课程创建一个“代理”。TestObject类设置正确,但它创建了一个名为TestObject_240F2B681A782799F3A0C3AFBE4A67A7E86083C3CC4A3939573C5410B408ECCE

要使ChannelFactory + WCF +实体框架一起工作,必须进入Context构造函数并添加以下内容:

ContextOptions.ProxyCreationEnabled = false;
用户回答回答于

当为Code First(EF 4.3)使用DbContext API时,我必须这样做:

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

扫码关注云+社区