2012-07-30 70 views
1

我想從我的wcf服務返回一個自定義類。我的代碼在下面,出現錯誤。WCF數據表關係

服務器在處理請求時遇到錯誤。異常消息是'DealerModel'類型的屬性'UserList'不是有效的屬性。不支持其類型爲原始類型或複雜類型集合的屬性。'。查看服務器日誌獲取更多詳細信異常棧跟蹤是:

我想要得到像下面這樣的json值;

<Dealer> 
     <DealerName/> 
     <DealerAdress/> 
     <Users> 
       <FirstName/> 
       <LastName/> 
       <FirstName/> 
       <LastName/> 
     </Users> 
</Dealer> 

我的代碼

using System; 
using System.Linq; 
using System.Data.Objects; 
using System.Data.Objects.DataClasses; 

public class DataModel:IDisposable 
{ 
    private xModel.xEntities _dbContext = new xSocialModel.xEntities(); 

    public DataModel() 
    { 
     Users = from e in _dbContext.Users 
       select new UserModel 
       { 
        UserID = e.UserID, 
        Firstname = e.Firstname, 
        Lastname = e.Lastname 
       }; 

     Dealers = from e in _dbContext.Dealers 
        select new DealerModel 
        { 
         DealerID = e.DealerID, 
         DealerName = e.Name, 
         DealerAddress = e.Address, 
         UserList = e.Users 
        }; 

    } 

    /// <summary>Returns the list of users.</summary> 
    public IQueryable<UserModel> Users { get; private set; } 

    public IQueryable<DealerModel> Dealers { get; private set; } 


    void IDisposable.Dispose() 
    { 
     _dbContext.Dispose(); 
    } 
} 



    using System; 
    using System.Data.Services.Common; 
    using System.Runtime.Serialization; 
    using System.Collections.Generic; 
    using System.ServiceModel; 
    using System.Data.Objects.DataClasses; 
    using System.Linq; 

    /// <summary>Represents a User.</summary> 

    [DataServiceKey("UserID")] 
    public class UserModel 
    { 
     public Guid UserID { get; set; } 

     public string Firstname { get; set; } 

     public string Lastname { get; set; } 

    } 


    [DataServiceKey("DealerID")] 
    public class DealerModel 
    { 
     public Guid DealerID { get; set; } 

     public string DealerName { get; set; } 

     public string DealerAddress { get; set; } 

     **public EntityCollection<xModel.User> UserList { get; set; }** 

    } 

回答

0

我有很多的麻煩這一點。投影似乎不如RIA服務所用的那樣好。我將繼續並假設您正在使用實體框架。我發現要做到這一點的唯一方法是在您的edmx中創建複雜類型。

爲此,請打開您的EDMX,然後在右窗格中選擇模型瀏覽器。在「模型」節點下,您將看到「複雜類型」,右鍵單擊並選擇「創建複雜類型」。然後在同一個窗口中,您可以命名您的類型併爲其指定罐頭類型的各種屬性。

從你的問題看來你有一個屬性是一個列表。我無法用包含其他實體的屬性創建這些複雜類型。不是說我無法弄清楚它是不可能的。

現在在您的DataService中,使用新複雜類型的返回類型創建一個服務方法。在服務方法中,使用投影來填充對象(或列表)並像任何其他實體一樣返回它。在前端,您需要將它稱爲服務方法而不是實體,但否則JSON將與其他實體查詢類似。

山姆穆勒對使用這種技術的一個非常漂亮的博客,檢查出來:http://samuelmueller.com/2009/11/working-with-projections-and-dtos-in-wcf-data-services/

+0

非常感謝您的回答。是的,我正在使用實體框架。我已經嘗試過複雜的類型,但沒有運氣。只有像int,字符串等基本類型我必須用屬性填充我的列表:(.sql關係返回一個實體集合是e.user,但我無法弄清楚如何使用並顯示它 – 2012-07-30 14:18:32

+0

你的用戶對象是什麼包含,當你收到你的用戶對象時,是否有可能創建第二個回調服務器? – muck41 2012-07-30 14:26:40

+0

或者你是否考慮過在你的OData查詢中使用$ expand調用?如果你的實體之間有相互關係,想想你的問題的外觀 – muck41 2012-07-30 14:28:02