这个标题真够拗口的。让我尽量说清楚...
我有一个用 .NET 4 编写的 WCF REST 服务,它使用实体框架将一些数据从 SQL Server 提取到对象列表中。然后将对象作为 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 不是像它应该的那样简单地返回一个 Activity 列表,而是返回一个 Activity 列表,其中一些活动引用了基本活动中的其他活动。这听起来令人困惑,但请看下面的图片:
返回的 XML:http ://bara.stardock.com/images/activity_xml1.png
引用“i8”的活动是指实际在活动内部的另一个活动,ID 为“i2”:http ://bara.stardock.com/images/activity_xml2.png
我的问题是,如何从 Activity 对象中删除所有这些额外的关系?我希望它只是一个 Activity 列表,没有由实体框架自动生成的嵌套 ActivityType、EntityKey 等。
我希望我已经充分解释了自己。如果没有,请告诉我您还想查看哪些其他详细信息,我会提供。
巴拉