[seasar-dotnet:1021] Re: DBFlute &S2Dxoによるデータ詰め替えについて

中川弘一08 [E-MAIL ADDRESS DELETED]
2008年 10月 20日 (月) 18:58:56 JST


中井さん

はじめまして、中川と申します。

私も過去に同じ現象に遭遇しました。

DBFluteで生成したEntityと自作のPONO間でデータを写す際に同じ現象が発生し
ました。
S2Dxoが無限に階層を掘り下げてプロパティ情報を取得しに行くので、循環参照
するようなプロパティがある場合に、オーバーフローが発生しているようでした。
たしかDBMetaプロパティあたりだったと記憶しています。

今取り組んでいる案件では、2階層以上はプロパティを検索しないように改造し
て使用しています。

根本的な解決策でなくて申し訳ありませんが、情報共有まで。


Nakai さんは書きました:
> 小谷さん
> 
> お世話になります。中井です。
> 
>>> ソースを読んでみた限りでは
>>> 再帰的にプロパティを探しに行かなくなるので
>>> 変換先にお目当ての名称をもつプロパティがなければ
>>> 移し替えが行われない、という可能性がありそうです。
> 
> 何故か全項目移し替えが行われてます。不思議です・・・。
> 
>>> 恥ずかしながらすぐには良い修正方法が思いつかないので
>>> もう少々お時間を下さい。
> 
> お忙しいところ申し訳ありません。
> よろしくお願い致します。
> 
> 
> 
> koyak <[E-MAIL ADDRESS DELETED]> wrote:
> 
>> 中井さん
>>
>> 小谷です。
>> S2Dxoには詳しくないコミッタですが、
>> コメントさせていただきます。
>>
>>> S2Dxoのソースを見て、下記部分をコメントアウトすると、
>>> データの移し替えも正しく行われたのですが、何か他に影響が出ますでしょうか?
>> ソースを読んでみた限りでは
>> 再帰的にプロパティを探しに行かなくなるので
>> 変換先にお目当ての名称をもつプロパティがなければ
>> 移し替えが行われない、という可能性がありそうです。
>>
>>
>> StackOverflowExceptionが起きている原因は
>> そのお目当てのプロパティを再帰的に"ずっと"探し続けて
>> しまっていることによると思います。
>> (見当違いでしたらツッコミをお願いします>識者の方々)
>>
>> 恥ずかしながらすぐには良い修正方法が思いつかないので
>> もう少々お時間を下さい。
>>
>> 2008/10/20 17:53 kubo <[E-MAIL ADDRESS DELETED]>:
>>> 久保(jflute)です。
>>>
>>> 中井さん、こんばんは
>>>
>>> 早速確認させて下さい。
>>> コメントアウトされた部分で、実際例外が発生する直前
>>> の処理における「destType」と「srcValue」は何になるか
>>> 教えて頂けますでしょうか?
>>>
>>>
>>> #
>>> # S2Dxo詳しいコミッタの方気づいた時に「Help」お願いします
>>> #
>>>
>>> 2008/10/20 中井 雅文 <[E-MAIL ADDRESS DELETED]>:
>>>> お世話になります。中井と申します。
>>>>
>>>> 現在、Quill、DBFlute、S2Dxoでアプリケーションを作成しております。
>>>>
>>>> DBFluteで自動生成したEntityをカスタムDtoに移送しようとS2Dxoを使ったのですが、
>>>> 以下のExceptionが発生してしまいました。
>>>> (移送元が試しに作ったカスタムEntityであれば問題ありません)
>>>>
>>>> 【発生場所】
>>>> Seasar.Dxo.Interceptor.DxoInterceptor._TryExchangeSameNameProperty
>>>>
>>>> 【例外内容】
>>>> 'System.StackOverflowException' のハンドルされていない例外が mscorlib.dll で発生しました。
>>>>
>>>>
>>>> S2Dxoのソースを見て、下記部分をコメントアウトすると、データの移し替えも正しく行われたのですが、何か他に影響が出ますでしょうか?
>>>>
>>>> お忙しいところ申し訳ありませんが、よろしくお願い致します。
>>>>
>>>>
>>>> -----------------------------------------------------
>>>>
>>>> destInfo = destType.GetProperty(targetPropertyName);
>>>> if (destInfo != null && destInfo.CanRead && destInfo.CanWrite)
>>>> {
>>>>    _ConvertProperty(sourceInfo, source, dest, destInfo, existProperty);
>>>> }
>>>>    // 異なる場合、再帰で調査する
>>>>
>>>>
>>>> ↓↓↓↓↓↓↓↓↓↓以下コメントアウトで正常動作↓↓↓↓↓↓↓↓↓
>>>> /*
>>>> else
>>>> {
>>>>    object srcValue = sourceInfo.GetValue(source, null);
>>>>    if (srcValue != null)
>>>>    {
>>>>        // 変換元を調査する
>>>>        if (srcValue.GetType().Namespace != "System")
>>>>        {
>>>>            AssignTo(srcValue, dest);
>>>>        }
>>>>            // 変換先を調査する
>>>>        else
>>>>        {
>>>>                        ↓↓↓↓↓↓↓↓↓↓ここでException発生↓↓↓↓↓↓↓↓↓
>>>>            PropertyInfo[] properties = destType.GetProperties();
>>>>                        ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
>>>>            foreach (PropertyInfo property in properties)
>>>>            {
>>>>                object destValue = property.GetValue(dest, null);
>>>>                if (destValue != null && destValue.GetType().BaseType != typeof (ValueType) &&
>>>>                    destValue.GetType().Namespace != "System")
>>>>                    AssignTo(source, destValue);
>>>>            }
>>>>        }
>>>>    }
>>>> }
>>>> */
>>>>
>>>>
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> 
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> 
> 



seasar-dotnet メーリングリストの案内