【问题标题】:Umbraco Database .Fetch<>() code error - SQL, C#, ASP.NETUmbraco 数据库 .Fetch<>() 代码错误 - SQL、C#、ASP.NET
【发布时间】:2015-08-29 05:00:13
【问题描述】:

我正在查看使用以下 SQL 的项目中的一些代码:

List<RoomAllotmentViewModel> listRoomAllotment = db.Fetch<RoomAllotmentViewModel>
                    (
                        "SELECT Id" +
                        ", CONVERT(DATETIME, CONVERT(VARCHAR(4),[Year],0) + '-' + CONVERT(VARCHAR(2),[Month],0) + '-' + CONVERT(VARCHAR(2),[Date],0),120) AllotmentDate" +
                        ", RoomTypeId" +
                        ", (SELECT RoomType FROM RoomType R WHERE A.RoomTypeid = R.Id) RoomTypeName" +
                        ", (Alloted - Booked) Available" +
                        ", Price" +
                        " FROM Room_Allotment A" +
                        " WHERE" +
                        " CONVERT(DATETIME, CONVERT(VARCHAR(4),[Year],0) + '-' + CONVERT(VARCHAR(2),[Month],0) + '-' + CONVERT(VARCHAR(2),[Date],0),120) >= '" + startDay.ToString("yyyy-MM-dd") + "'" +
                        " AND CONVERT(DATETIME, CONVERT(VARCHAR(4),[Year],0) + '-' + CONVERT(VARCHAR(2),[Month],0) + '-' + CONVERT(VARCHAR(2),[Date],0),120) < '" + endDay.ToString("yyyy-MM-dd") + "'" +
                        " ORDER BY AllotmentDate, RoomTypeId");

模型不是实体类:

public class RoomAllotmentViewModel
{
    public int Id { get; set; }
    public DateTime AllotmentDate { get; set; }
    public int RoomTypeId { get; set; }
    public string RoomTypeName { get; set; }
    public int Available { get; set; }
    public float Price { get; set; }
}

RoomType 和 Room_Allotment 表有实体类:

[TableName("RoomType")]
[PrimaryKey("Id", autoIncrement = true)]
[ExplicitColumns]
public class RoomType
{
    [Column]
    public int Id { get; set; }

    [Column]
    [Required(ErrorMessage = "Please provide RoomType", AllowEmptyStrings = false)]
    public string RoomType { get; set; }
}


[TableName("Room_Allotment")]
[PrimaryKey("Id", autoIncrement = true)]
public class Room_Allotment
{
    public Int64 Id { get; set; }
    public int Year { get; set; }
    public int Month { get; set; }
    public int Date { get; set; }
    public int RoomTypeId { get; set; }
    public int Alloted { get; set; }
    public int Booked { get; set; }
    public float Price { get; set; }
}

目前我在运行项目时遇到以下异常:

序列化类型对象时检测到循环引用 'System.Reflection.RuntimeModule'。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.InvalidOperationException:循环 序列化类型对象时检测到引用 'System.Reflection.RuntimeModule'。

[InvalidOperationException:检测到循环引用,同时 序列化“System.Reflection.RuntimeModule”类型的对象。]
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +2616 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +371 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat(序列化格式)+819
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +2834 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +371 System.Web.Script.Serialization.JavaScriptSerializer.SerializeEnumerable(IEnumerable 可枚举,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat(序列化格式)+186
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +2782 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +371 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat(序列化格式)+819
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +2834 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +371 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat(序列化格式)+819
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +2834 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +371 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat(序列化格式)+819
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +2834 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +371 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat(序列化格式)+819
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +2834 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +371 System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat(序列化格式)+819
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +2834 System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(对象 o,StringBuilder sb,Int32 深度,Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember) +371 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(对象 obj,StringBuilder 输出,SerializationFormat 序列化格式) +57 System.Web.Script.Serialization.JavaScriptSerializer.Serialize(对象 obj, SerializationFormat serializationFormat) +83
System.Web.Script.Serialization.JavaScriptSerializer.Serialize(对象 obj) +44 System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext 上下文)+325
System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
System.Web.Mvc.c__DisplayClass1a.b__17() +23 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter 过滤器,ResultExecutingContext preContext,Func1 continuation) +242
System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +21 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func
1 续)+242
System.Web.Mvc.c__DisplayClass1c.b__19() +21 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter 过滤器,ResultExecutingContext preContext,Func1 continuation) +242
System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +21 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList
1 过滤器,ActionResult actionResult) +175
System.Web.Mvc.Async.c__DisplayClass2a.b__20() +89 System.Web.Mvc.Async.c__DisplayClass25.b__22(IAsyncResult asyncResult) +102 System.Web.Mvc.Async.WrappedAsyncResult1.End() +57 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +43
System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult
1.End() +62
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +57 System.Web.Mvc.Async.c__DisplayClass4.b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult1.End() +62
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +47
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult
1.End() +62
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +47 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 结果)+9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9651688 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

startDay 和 endDay 的变量是:

var startDay = DateTime.ParseExact(arrival, "dd/MM/yyyy", CultureInfo.InvariantCulture);
var endDay = DateTime.ParseExact(departure, "dd/MM/yyyy", CultureInfo.InvariantCulture);

上述异常中这些变量的值是:

startDay: {30/08/2015 00:00:00}
endDay: {31/08/2015 00:00:00}

“db”及其方法是:ApplicationContext.Current.DatabaseContext.Database;,它是 Umbraco 核心库的一部分。

对于任何多余的信息,请提前致歉。基本上我的问题是:

  • 为什么会发生异常?
  • 是否有针对此问题的 LINQ 解决方案?

非常感谢

【问题讨论】:

    标签: c# sql linq umbraco


    【解决方案1】:

    听起来这个异常很可能发生,因为您在执行该查询时遇到了异常。第一个异常之后发生的情况是它尝试使用 JSON 序列化程序序列化此异常对象,从而导致您在此处实际看到的循环引用异常。

    所以你需要做的是真正找到最初的异常并解决导致它发生的问题。

    我会查看/App_Data/Logs/ 中的日志,看看是否有任何线索可以说明实际发生了什么异常。它可能非常简单——即使尝试序列化最简单的异常也会崩溃,因为异常对象的复杂结构无法通过开箱即用的序列化程序设置进行序列化。

    如果您从长远来看需要更可行的解决方案,我相信可以创建一个 ExceptionConverter 并将其注册到序列化程序使用的转换器列表中。然后,这将需要序列化实际的异常消息,这样您就可以实际看到错误是什么,而不是得到那个循环异常。然而,这不是我在 umbraco 解决方案中所做的事情,所以你可能需要谷歌一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多