該標題相當滿意。讓我儘可能地做到我能清晰....NET 4,WCF REST服務,實體框架,序列化和循環引用
我有一個WCF REST服務寫在使用實體框架從SQL Server的一些數據拉入對象的列表.NET 4。然後這些對象以XML形式返回給客戶端。問題在於,由於我的模型的關係,XML相互引用。
下面是一些代碼來幫助說明問題:
我的模型:http://bara.stardock.com/images/activity_model.png
活動類來處理業務邏輯:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class Activities : IActivities
{
public ActivitiesList GetActivities(string titleId, string accountId, string numToReturn)
{
stardockActivitiesEntities sdActivitiesDb = new stardockActivitiesEntities();
int accountIdInt = int.Parse(accountId);
List<Activity> items = (from a in sdActivitiesDb.Activities
join ab in sdActivitiesDb.ActivityBridges
on a.ActivityID equals ab.ActivityID
where ab.AccountID == accountIdInt
select a).ToList();
ActivitiesList list = new ActivitiesList(items);
return list;
}
}
對於上面的類接口:
[ServiceContract]
public interface IActivities
{
[OperationContract]
[WebGet(UriTemplate = "{titleId}/accounts/{accountId}/limits/{numToReturn}")]
ActivitiesList GetActivities(string titleId, string accountId, string numToReturn);
}
Activity類是自動由實體框架根據「活動」表的模型生成。但是,我沒有這個類通過創建ActivitiesList對象擴展:
[XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/Stardock.CVP.Stats")]
public partial class Activity
{
}
[XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/Stardock.CVP.Stats")]
[DataContract(IsReference=false)]
public class ActivitiesList
{
[DataMember]
public List<Activity> Activities { get; set; }
public ActivitiesList()
{
Activities = new List<Activity>();
}
public ActivitiesList(List<Activity> list)
{
Activities = new List<Activity>();
foreach (Activity item in list)
{
Activities.Add(item);
}
}
public void Add(Activity a)
{
Activities.Add(a);
}
}
所以再次解釋我的問題,我的XML,而不是簡單地回到它應該像活動的列表,而不是返回活動與列表一些活動參考了基本活動中的其他活動。這聽起來令人困惑,但看看下面的圖片:
返回的XML:http://bara.stardock.com/images/activity_xml1.png
與「6-18」的參考指的是另一項活動,實際上是在活動中與「I2」的ID活動:http://bara.stardock.com/images/activity_xml2.png
我的問題是,我怎麼能刪除所有來自活動對象這些額外的關係?我更喜歡它只是一個沒有由實體框架自動生成的嵌套的ActivityType,EntityKey等的Activity列表。
我希望我已經充分解釋了我自己。如果沒有,請告訴我您希望看到的其他詳細信息,然後提供給他們。
巴拉
一位同事寫了一些代碼生成工具,爲我使用第一種方法創建對象。似乎到目前爲止工作得很好,但這是最接近我的答案,所以它必須這樣做。 – Bara 2010-08-20 20:48:47