SubSonic 3.0.0.2 Structs.tt

subsonicsubsonic3t4

The error I'm getting seems to be coming out of the Structs.tt file. I'm using the Northwind db and only using the Products table (I excluded all other tables). I return Json(Product.All()).

Here's the error:

A circular reference was detected
while serializing an object of type
'SubSonic.Schema.DatabaseColumn'.Here's
the Stack Trace:

System.InvalidOperationException was
unhandled by user code Message="A
circular reference was detected while
serializing an object of type
'SubSonic.Schema.DatabaseColumn'."
Source="System.Web.Extensions"
StackTrace: at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable
enumerable, StringBuilder sb, Int32
depth, Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable
enumerable, StringBuilder sb, Int32
depth, Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object
o, StringBuilder sb, Int32 depth,
Hashtable objectsInUse,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object
obj, StringBuilder output,
SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object
obj, SerializationFormat
serializationFormat) at
System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object
obj) at
System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext
context) at
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext
controllerContext, ActionResult
actionResult) at
System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.b__e()
at
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter
filter, ResultExecutingContext
preContext, Func1 continuation) at
System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass11.<>c__DisplayClass13.b__10()
at
System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext
controllerContext, IList1 filters,
ActionResult actionResult) at
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext
controllerContext, String actionName)
at
System.Web.Mvc.Controller.ExecuteCore()
at
System.Web.Mvc.ControllerBase.Execute(RequestContext
requestContext) at
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext
requestContext) at
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase
httpContext) at
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext
httpContext) at
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext
httpContext) at
System.Web.Mvc.MvcHttpHandler.VerifyAndProcessRequest(IHttpHandler
httpHandler, HttpContextBase
httpContext) at
System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContextBase
httpContext) at
System.Web.Routing.UrlRoutingHandler.ProcessRequest(HttpContext
httpContext) at
System.Web.Routing.UrlRoutingHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext
context) at
ExtJSNorthwind._Default.Page_Load(Object
sender, EventArgs e) in
C:\Applications\Spikes\ExtJSNorthwind\ExtJSNorthwind\Default.aspx.cs:line
18 at
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr
fp, Object o, Object t, EventArgs e)
at
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object
sender, EventArgs e) at
System.Web.UI.Control.OnLoad(EventArgs
e) at
System.Web.UI.Control.LoadRecursive()
at
System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean
includeStagesAfterAsyncPoint)
InnerException:

Best Answer

This is fairly easy to fix. You need to just add a ScriptIgnore attribute to a couple of the methods in the ActiveRecord.tt file. Below are the changes that I made.

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

Note: I also added the attribute to the following method though I don't know if it is needed in your situation

        [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;
        }
    }
Related Topic