2010-11-09 16 views
1

我使用nhibernate創建的數據庫的域名庫。當我用庫創建web服務時,我發現很多關於無法在DataContract類中使用接口的錯誤。 e.q..NET XML Web服務和NHibernate:如何使用屬性

[DataContract] 
public class MyClass 
{ 
    ... 
    [DataMember] 
    public virtual IList<Item> Items {get;set;} 
    ... 
} 

接下來,我決定添加一些伎倆:我添加其他物業類型列表:

[DataContract] 
public class MyClass 
{ 
    ... 
    [XmlIgnore] 
    public virtual IList<Item> prItems {get;set;} 

    [DataMember] 
    public virtual List<Item> Items { 
     get{ 
      return this.prItems.ToList(); 
     } 
     set{ 
      this.prItems = value; 
     } 
    } 
    ... 
} 

這項工作很好 - 我可以在我的客戶端上獲取列表,但是當我需要更改列表項目 - 這是在服務器上是空的,因爲客戶端什麼都不知道prItems。 你可以給我建議嗎?

回答

0

使用您最初的嘗試,但有一個附加屬性:

[DataContract] 
[KnownType(typeof(List<Item>))] 
public class MyClass 
{ 
    ... 
    [DataMember] 
    public virtual IList<Item> Items {get;set;} 
    ... 
} 

的更多信息:http://msdn.microsoft.com/en-us/library/ms730167.aspx

編輯:

更新KnownType一個完整的通用定義

+0

你確定嗎?當我嘗試使用這個,再次我得到錯誤 - 接口不能序列化如何和更早。 – viko 2010-11-09 09:01:20

+0

是的,我確定(至少對於非nhibernate項目,但即使使用透明代理,它們也應該一樣工作)。我只是測試它。問題在於它是一個泛型定義,但KnownType只聲明'typeof(List)'。我已經更新了我的答案。 – jgauffin 2010-11-09 09:18:19

+0

你有沒有試過我更新的答案? – jgauffin 2010-11-09 14:19:46

2

你不能使用使用NHibernate和c加載的類實例自從NHibernate使用代理集合類進行延遲加載並且NHibernate集合代理類不可序列化以來,就會收集集合。

構建您在Web服務界面中使用的單獨的DTO類。

+0

實現(透明代理)未被序列化,接口('IList ')爲。所以它應該工作,對吧? – jgauffin 2010-11-09 09:21:26

+0

@jgauffin:不,它是序列化的具體實現(如你所說的透明代理)。而且由於它在NHibernate中不可序列化,所以它不起作用。 – 2010-11-11 10:55:09