首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET 4、WCF REST服务、实体框架、序列化和循环引用

.NET 4、WCF REST服务、实体框架、序列化和循环引用
EN

Stack Overflow用户
提问于 2010-08-07 03:44:44
回答 2查看 2.3K关注 0票数 1

这个标题相当冗长。让我尽可能的说清楚...

我有一个用.NET 4编写的WCF REST Service,它使用实体框架将一些数据从SQL Server拉到对象列表中。然后将这些对象作为XML返回给客户端。问题在于,由于我的模型的关系,XML之间存在相互引用。

下面是一些代码来帮助说明这个问题:

我的模型:http://bara.stardock.com/images/activity_model.png

处理服务逻辑的Activities类:

代码语言:javascript
复制
[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;
    }
}

上述类的接口:

代码语言:javascript
复制
[ServiceContract]
public interface IActivities
{
    [OperationContract]
    [WebGet(UriTemplate = "{titleId}/accounts/{accountId}/limits/{numToReturn}")]
    ActivitiesList GetActivities(string titleId, string accountId, string numToReturn);
}

Activity类是由实体框架根据我的Activity表模型自动生成的。但是,我确实通过创建一个ActivitiesList对象对该类进行了扩展:

代码语言:javascript
复制
[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

引用为"i8“的活动引用的另一个活动实际上位于id为”i2“的活动中:http://bara.stardock.com/images/activity_xml2.png

我的问题是,如何从Activity对象中删除所有这些额外的关系?我更喜欢它只是一个活动列表,没有由实体框架自动生成的嵌套ActivityType、EntityKey等。

我希望我已经充分地解释了我自己。如果没有,请让我知道你想看的其他细节,我会提供给你。

芭拉

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-20 08:40:22

这里有两个选项,但是这两个选项都需要一些工作。

我的建议是创建包装器类,它公开适当的数据并返回它们。

返回新名称() {Id = Person.Id,PersonWrapper= Person.Name};

PersonWrapper只需要自动属性,您可以使用相关属性精确地控制返回的数据以及返回数据的方式。

另一种建议来自本演练:http://blogs.msdn.com/b/endpoint/archive/2010/01/07/getting-started-with-wcf-webhttp-services-in-net-4.aspx

这建议使用POCO类(同样,您必须手动创建),而不是依赖实体框架代码生成,实体框架代码生成根据约定(在大多数情况下)映射到概念模型中的实体(更多信息请参见:http://blogs.msdn.com/b/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the-experience.aspx)

第二种选择需要关闭代码生成,所以如果只打算公开几个类,那么为每个实体手动创建POCO类可能会很痛苦,这就是为什么我建议只为需要公开的对象创建包装类的原因

马丁

票数 1
EN

Stack Overflow用户

发布于 2010-08-07 20:24:42

我猜如果你使用EF(4),你可以在模型中(例如在设计器中)移除你不需要/想要的关联。这样,代码生成器就不会生成用于导航关系的属性。

编辑:通过关联,我指的是真正的“关联”(图中的线条)和导航属性(在实体的底部)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3427203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档