【问题标题】:SubSonic 3.0.0.2 Structs.ttSubSonic 3.0.0.2 结构.tt
【发布时间】:2009-07-28 12:44:14
【问题描述】:

我得到的错误似乎来自 Structs.tt 文件。我正在使用 Northwind 数据库并且仅使用 Products 表(我排除了所有其他表)。我返回 Json(Product.All())。

这是错误:

检测到循环引用 在序列化类型对象时 'SubSonic.Schema.DatabaseColumn'。这里是 堆栈跟踪:

System.InvalidOperationException 是 用户代码未处理 Message="A 在检测到循环引用时 序列化一个类型的对象 'SubSonic.Schema.DatabaseColumn'。” 来源="系统.Web.Extensions" 堆栈跟踪:在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable 可枚举,StringBuilder 某人,Int32 深度,Hashtable objectsInUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable 可枚举,StringBuilder 某人,Int32 深度,Hashtable objectsInUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度, 哈希表对象InUse, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(对象 obj,StringBuilder 输出, 序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(对象 obj,序列化格式 序列化格式)在 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(对象 obj) 在 System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext 上下文)在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext 控制器上下文,动作结果 动作结果)在 System.Web.Mvc.ControllerActionInvoker.c__DisplayClass11.b__e() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter 过滤器,ResultExecutingContext preContext,Func1 延续)在 System.Web.Mvc.ControllerActionInvoker.c__DisplayClass11.c__DisplayClass13.b__10() 在 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext 控制器上下文,IList1 过滤器, ActionResult actionResult) 在 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext 控制器上下文,字符串动作名称) 在 System.Web.Mvc.Controller.ExecuteCore() 在 System.Web.Mvc.ControllerBase.Execute(RequestContext 请求上下文)在 System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext 请求上下文)在 System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) 在 System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) 在 System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) 在 System.Web.Mvc.MvcHttpHandler.VerifyAndProcessRequest(IHttpHandler httpHandler, HttpContextBase httpContext) 在 System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContextBase httpContext) 在 System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContext httpContext) 在 System.Web.Routing.UrlRoutingHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext 上下文)在 ExtJSNorthwind._Default.Page_Load(对象 发件人,EventArgs e) 在 C:\Applications\Spikes\ExtJSNorthwind\ExtJSNorthwind\Default.aspx.cs:line 18 点 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, 对象 o, 对象 t, EventArgs e) 在 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(对象 发件人,EventArgs e) 在 System.Web.UI.Control.OnLoad(EventArgs 吃 System.Web.UI.Control.LoadRecursive() 在 System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔值 包括StagesAfterAsyncPoint) 内部异常:

【问题讨论】:

  • 这是异常消息:在序列化“SubSonic.Schema.DatabaseColumn”类型的对象时检测到循环引用。
  • 不知道这是否有助于解决问题,但当我深入研究异常时,我遇到了这个问题:消息:“方法只能在 Type.IsGenericParameter 的类型上调用是真的。”全名:System.Web.Script.Serialization.JavaScriptSerializer
  • 阅读该帖子的答案是选择要返回的特定字段。我的问题是我需要 ProductID,当代码到达 ActiveRecord.cs 中的 GetKeyColumn() 方法时,它会返回 ProductID。 ProductID 列的 Structs.cs 上的断点正在传递。
  • 听起来和我的问题一样,我认为循环引用是因为我们有 IQueryable 外键引用,并且在序列化时卡在循环中?我将其更改为仅返回特定列并且它有效。

标签: subsonic subsonic3 t4


【解决方案1】:

这很容易解决。您只需将 ScriptIgnore 属性添加到 ActiveRecord.tt 文件中的几个方法。以下是我所做的更改。

        [ScriptIgnore]
    public IList<IColumn> Columns{
        get{
            return tbl.Columns;
        }
    }

注意:我也将属性添加到以下方法中,但我不知道您的情况是否需要它

        [ScriptIgnore]
    public IQueryable<<#=fk.OtherClass #>> <#=propName #>
    {
        get
        {

              var repo=<#=Namespace #>.<#=fk.OtherClass#>.GetRepo();
              return from items in repo.GetAll()
                   where items.<#=CleanUp(fk.OtherColumn)#> == _<#=CleanUp(fk.ThisColumn)#>
                   select items;
        }
    }

【讨论】:

  • ScriptIgnore 属性在 System.Web.Extensions 中,如果你想序列化整个对象,这绝对是最好的解决方案,但我意识到使用 JSon 时你不会经常使用整个对象.不过我肯定会使用它。
  • 谢谢!虽然我希望有更好的解决方案,但这是一个很棒的临时修复。
  • @woopstash 我认为“更好”的解决方案可能是使用 DTO 或其他对象对其进行序列化。就我而言,我有 3 个属性,我只需要 [ScriptIgnore] 引用回父级的那个...所以这对我来说是一个完全合理的解决方案
  • @runxc1 Bret Ferrier : 在哪里放置 [ScriptIgnore] 的正确位置
【解决方案2】:

似乎我们在序列化方面遇到了问题 :)。您能否将此作为问题添加到我们的列表中?我真的很感激。

【讨论】:

  • 我将它发布到 GitHub,现在是第 82 期。谢谢罗伯。
  • 查看我在下面发布的修复。 GitHub 慢得像泥巴,否则我也会把它贴在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
相关资源
最近更新 更多