使用帶有WCF 4.0的Entity Framework 4.0時出現DataContractSerializer錯誤

.net entity-framework

我試圖通過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。我通過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 + Entity Framework一起工作,您必須進入Context構造函數並添加以下內容:

ContextOptions.ProxyCreationEnabled = false;

我希望這有助於其他人。


熱門答案

當使用DbContext API代碼優先(EF 4.3)時,我必須這樣做:

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因