2012-11-06 122 views
1

我是新來的WCF,今天我遇到了DataContracts的問題。當對象從WCF服務返回給客戶端時,我收到異常。WCF - 實體框架,生成的實體序列化錯誤

SvcTraceViewer顯示了一個異常:

類型 'System.Data.Entity.DynamicProxies.Person_7C797A477DD73534D4E8E743E1FCC1C75DAB75933D03B845A097A8B83F2DD748' 數據合同名稱 「Person_7C797A477DD73534D4E8E743E1FCC1C75DAB75933D03B845A097A8B83F2DD748:HTTP://schemas.datacontract。 org/2004/07/System.Data.Entity.DynamicProxies' 不是預期的。考慮使用DataContractResolver或將任何未知的 類型靜態添加到已知類型的列表中 - 例如,使用KnownTypeAttribute屬性的 或將其添加到傳遞給DataContractSerializer的已知類型的 列表中。

我在解決方案中有幾個項目。

  • 數據訪問(的EntityFramework EDMX文件被放在這裏)
  • 模型(由DbContextGenerator產生的實體在此)
  • WCF服務(DataContracts在Model項目實施)
  • WPF應用程序(運行ServiceHost的)
  • 控制檯應用程序(調用WPF應用程序託管WCF項目或服務)

這裏是在WCF操作合同:

[OperationContract] 
Person[] GetAllPersons(int version); 

接口的實現:

public Person[] GetAllPersons(int version) 
{ 
    return StorageService.GetAllPersons(version); 
} 

當數據被在客戶端(ConsoleApp)收到的excepion被拋出。

我猜是因爲他們是局部類

這裏的問題是關係到生成的實體,是Person類:

public partial class Person 
{ 
    public Person() 
    { 
     this.Project = new HashSet<Project>(); 
    } 

    public int Id { get; set; } 
    public Nullable<long> AddressId { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
    public string FirstName { get; set; } 
    public Nullable<long> GeoLocationId { get; set; } 
    public string FullGeoLocationName { get; set; } 
    public Nullable<long> SupervisorId { get; set; } 
    public Nullable<long> PositionId { get; set; } 
    public string Position { get; set; } 
    public string Office { get; set; } 
    public string NativeName { get; set; } 
    public string Location { get; set; } 
    public string FullName { get; set; } 
    public Nullable<long> PmcPersonId { get; set; } 

    public virtual ICollection<Project> Project { get; set; } 
    public virtual PersonDataVersion DataVersion { get; set; } 
    public virtual Workspace Workspace { get; set; } 
} 

我試圖以紀念類和它的成員[DataContract][DataMember]屬性,但錯誤仍然發生。 [KnownType(typeof(Person)]屬性也沒有幫助。

是否可以使用生成的實體作爲數據契約?

回答

2

DynamicProxies表明您正在使用延遲加載,並且錯誤可能是由WCF嘗試序列化對象時上下文被關閉引起的。

嘗試禁用延遲加載並使用預先加載。

+5

禁用LazyLoading沒有幫助,但禁用代理運行良好'con.Configuration.ProxyCreationEnabled = false;'謝謝 – opewix

0

您應該真的將Person對象映射到數據傳輸對象或Poco對象。您可以相應地使用DataMember屬性修飾這些屬性。如果你必須禁用延遲加載,你將失去ORM的好處,查詢將運行你甚至可能不用的數據 - 在一個小系統中可能不是一個大問題,但隨着系統的增長,它可能會讓他們沮喪。