[seasar-dotnet:2512] $table.equalsHashcodeColumnListへの追加方法

竹内学 [E-MAIL ADDRESS DELETED]
2016年 9月 21日 (水) 17:04:22 JST


竹内です。いつもお世話になっております。

さて、DbFlute.NETで、次の様なコードを書いた場合、常に先頭の HasPrimaryKeyValue が false
のエンティティのインデックスが返されます。

var entity = new Hoghog(); // DbFlute.NETで自動生成されたクラス
collection.Add(entity);
collection.IndexOf(entity); -- ここ

これはBaseEntity.vmnet の Equals() 内で、$table.equalsHashcodeColumnList
でメンバになっているフィールド値が等しい物を true としているからだと思いますが、
$table.equalsHashcodeColumnListに明示的に追加する方法ってあるのでしょうか?

ちなみに、生成された HogHog#Equals() は次の様になっています。

        public override bool Equals(Object other) {
            if (other == null || !(other is Hoghog)) { return false; }
            Hoghog otherEntity = (Hoghog)other;
            if (!xSV(this.Id, otherEntity.Id)) { return false; }
            return true;
        }

これを、Id だけじゃなくて、ExEntity で追加したプロパティも加えたいのです。

何をしたいかと言いますと、
DbFlute.NETで取得できたリストをDataGridに表示しているのですが、
それにエンティティの新規追加ボタンを用意し、新規エンティティを追加し、その行に移動したいのです。

しかし、Id だけの比較ですと、新規エンティティではまだ Id は null の状態なので、
IndexOfで得られるインデックスは Id が null であるエンティティ群の先頭なので、
動きが目的と異なってしまうのです。

new した直後に Id にユニークな番号を振るという手段もありますが、
その方法だと、HasPrimaryKeyValue が常に true になってしまうので、
大人の事情でちょっと採用できないです。

なので、Id が null の場合にのみユニークな番号を管理するプロパティを追加し、
IndexOfで適切な値を取得できるようにしたいのです。

取りあえず、BaseEntity.vmnet の Equals の部分を

        public override bool Equals(Object other) {
            if (other == null || !(other is $myClassName)) { return false; }
            $myClassName otherEntity = ($myClassName)other;
            // 追加開始
            if (!this.HasPrimaryKeyValue && !otherEntity.HasPrimaryKeyValue) {
                return this == otherEntity;
            }
            // 追加終了
#foreach ($col in $table.equalsHashcodeColumnList)
            if (!xSV(this.${col.javaName},
otherEntity.${col.javaName})) { return false; }
#end
            return true;
        }

としてしのいでいますが。

よろしくお願いします。


-- 
竹内 学 <mailto:mtakeuchi @ ailesys.co.jp>


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