Linq 如何在没有循环引用的情况下实现实体框架多对多关系的json序列化

Linq 如何在没有循环引用的情况下实现实体框架多对多关系的json序列化,linq,json,asp.net-mvc-3,serialization,entity-framework-4,Linq,Json,Asp.net Mvc 3,Serialization,Entity Framework 4,我的数据库中有3个表-会议,活动类型和一个连接表会议活动。每个会议可能有零个或多个标准活动,每个活动可能在零个或多个会议中进行 会议(ConferenceID,ConferenceName) ConferenceActivities(ConferenceID,ActivityTypeID) ActivityTypes(ActivityTypeID、ActivityTypeDesc) 我在现有数据库上使用实体框架,在MVC3应用程序中使用.tt模板,我生成了一个DbContext和POCO对象,注

我的数据库中有3个表-
会议
活动类型
和一个连接表
会议活动
。每个会议可能有零个或多个标准活动,每个活动可能在零个或多个会议中进行

会议(ConferenceID,ConferenceName)

ConferenceActivities(ConferenceID,ActivityTypeID)

ActivityTypes(ActivityTypeID、ActivityTypeDesc)

我在现有数据库上使用实体框架,在MVC3应用程序中使用.tt模板,我生成了一个DbContext和POCO对象,注意到它只生成了两个对象,
ActivityType
Conference
,这很好,因为它似乎理解了中间表

它还为我的会议添加了一系列活动

 public virtual ICollection<ActivityType> ActivityTypes { get; set; }
另一个建议是将模型上的
延迟加载启用
属性设置为false。。这没有什么区别,我仍然得到递归错误

我已经尝试删除
Virtual
关键字,我相信它可以关闭延迟加载。。和尝试。包括(…)但再次没有乐趣

另一个建议是将访问器从
public
更改为
internal
,但是这与序列化没有什么不同

有人还建议从ActivityType类中删除会议集合,这不是我真正想做的。。但这样做只会产生错误“指定的架构无效”

我正在使用我相信最新版本的nuget和相关的EF、脚手架和模板

我想要实现的是一种开箱即用的东西吗?如果是这样,我会错过什么设置?如果不是,这里的最佳实践是什么?我知道我能完成这项工作的唯一方法是自己手动构建对象


建议或一个完整的工作演示的链接(我已经看到很多建议和代码片段,但似乎不起作用!!)谢谢。我肯定有人做了这件事,而且一定能成功。

不要把你的模型课传给别人。使用视图所需的数据或json输出创建viewmodel。我知道您尝试将其投影到匿名类型中,但将其投影到具体的viewmodel中,它应该可以完美地工作

public virtual ICollection<Conference> Conferences { get; set; }
public JsonResult GetConference(int conferenceId)
{
    Conference x = context.Conferences.Include("ActivityTypes").FirstOrDefault<Conference>(i => i.EventID == eventId);
    return Json(x, JsonRequestBehavior.AllowGet);
}
    var thing = from r in context.Conferences
                select new
                {
                    r.ConferenceID,
                    r.ConferenceName,
                    ActivityTypes = new List<ActivityType>(
                        (from c in r.ActivityTypes
                         select new ActivityType()
                         {
                             ActivityTypeDesc = c.ActivityTypeDesc,
                             ActivityTypeID = c.ActivityTypeID
                         }).Cast<ActivityType>())
                };
     return Json(thing, JsonRequestBehavior.AllowGet);