2

カスタム/非データベースプロパティを含むレコードを更新すると、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));
            ...
            }

いつもあなたの助けに感謝します!

4

1 に答える 1

2

この行が問題のようです:

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

表示したコードがどのクラスにあるかを推測しています。がクラスUnitTypeIdのプロパティである場合、nullの場合はここで新しいクラスを作成し、新しいクラスを作成し続け、最終的にはを引き起こします。ProjectTaskProjectTaskTaskTemplateRecordStackOverflowException

おそらく、このアプローチはうまくいくでしょう:

if (TaskTemplateRecord != null)
    return TaskTemplateRecord.UnitTypeId;
else
   return 0; // some default value rather than creating the class again
于 2012-12-20T21:52:10.487 に答える