[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 メーリングリストの案内