c# - 使用自引用表更新 LINQ 记录时出现 StackOverFlowException

标签 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));
            ...
            }

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

最佳答案

看来这一行可能是问题所在:

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

我猜测您所显示的代码位于哪个类中。如果 UnitTypeIdProjectTask 类的属性,那么您将创建一个新的如果 TaskTemplateRecord 为 null,则 ProjectTask 会继续创建新类,最终导致 StackOverflowException

也许这种方法会起作用:

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

关于c# - 使用自引用表更新 LINQ 记录时出现 StackOverFlowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13980749/

相关文章:

c# - ThreadPool.QueueUserWorkItem 使用 ASP.Net

c# - 按钮 C# 中的 if 语句

c# - 如何将 "collection"与创建和添加 "lookaheadRunInfo"的新实例分开

c# - 更改 For 辅助方法创建的名称

asp.net - 修改特定 gridview 列的数据行值

javascript - 使用文件的数据库路径打印页面

asp.net - 在mvc5中获取复选框值

c#-4.0 - GDI+ selenium webdriver 中发生一般错误

C# 创建临时文件,写入,打印,然后删除

c# - 为什么 Httpclient 总是返回相同的结果 C# PCL?