更新具有自引用表的LINQ记录时的StackOverFlowException

时间:2012-12-20 21:28:20

标签: c# asp.net c#-4.0 linq-to-sql

当我更新其中包含自定义/非数据库属性的记录时,我收到了StackOverflowException。这些属性查看数据库属性,最重要的是查看关联记录中的值。

相关记录是问题 - TaskTemplateRecord的设置逐渐消失。

如果我在这里返回0,一切都很好。我认为以下是一遍又一遍地调用TaskTemplateRecord。我只是无法弄清楚原因。

我该如何解决这个问题?有没有办法告诉LINQ在更新操作期间跳过这样的属性?

            if (this == new ProjectTask()) return 0;

有没有办法轻松比较上述值?这也可能有用。

    public int UnitTypeId
    {
        get
        {
            //return 0;

            //If this is a task template return the actual database value
            if (IsTaskTemplate)
                return UnitTypeIdPrivate;
            //If there is a task template override and UnitTypeId has a value return that
            else if (IsTemplateOverride && UnitTypeIdPrivate != 0)
                return UnitTypeIdPrivate;

            //Else return the value in the task template record.
            return (TaskTemplateRecord ?? new ProjectTask()).UnitTypeId;
        }
        set { UnitTypeIdPrivate = value; }
    }

这是抛出StackOverFlowException的地方。

    public ProjectTask()
    {
            ...
            this._ProjectTasksUsingThisTemplate = new EntitySet<ProjectTask>(new Action<ProjectTask>(this.attach_ProjectTasksUsingThisTemplate), new Action<ProjectTask>(this.detach_ProjectTasksUsingThisTemplate));
            ...
            }

一如既往地感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

似乎这一行可能是问题所在:

return (TaskTemplateRecord ?? new ProjectTask()).UnitTypeId;

我猜测你所展示的代码属于哪个类。如果UnitTypeIdProjectTask类的属性,那么你在这里创建一个新的ProjectTask如果TaskTemplateRecord为null,它将继续创建新类,最终导致StackOverflowException

也许这种方法可行:

if (TaskTemplateRecord != null)
    return TaskTemplateRecord.UnitTypeId;
else
   return 0; // some default value rather than creating the class again