私たちはついに開発者の中でCRUD操作を実行するポイントに到達しました。そのほとんどは、独自の参照キーのクリーンアップ(古い事前に設計されたデータベースを使用しています)を除いて機能します。
私たちが抱えている問題は、複合キーを持つオブジェクトが、変更されても更新されていないように見えることです。
現在、私は単にScreen Numberプロパティを更新してから、flushを呼び出しようとしています。発生する他の操作(削除など)がいくつかありますが、それらは予期されており、この例とは無関係です。
ありがとう!
私のマッピングは以下の通りです:
public class Xref_el_c : ClassMap<Xref_EntityCaseEntity>
{
public Xref_el_c()
{
Table("Xref_el_c");
CompositeId()
.KeyProperty(x => x.EntityRef, "xelc_el_ref")
.KeyProperty(x => x.Case, "xelc_c_ref")
.KeyProperty(x => x.ScreenNumber, "xelc_screen");
}
}
/オブジェクト/
public class Xref_EntityCaseEntity : BaseCompositeEntity
{
public virtual int EntityRef { get; set; }
public virtual int Case { get; set; }
public virtual int? ScreenNumber { get; set; }
public override bool Equals(object obj)
{
if (obj == null)
return false;
Xref_EntityCaseEntity xe = obj as Xref_EntityCaseEntity;
if (xe == null)
return false;
return EntityRef == xe.EntityRef && Case == xe.Case && ScreenNumber == xe.ScreenNumber;
}
public override int GetHashCode()
{
return (EntityRef + "|" + Case + "|" + ScreenNumber).GetHashCode();
}
}
以下の作業を行うコード:
IEnumerable<Xref_EntityCaseEntity> xrefs = GetEntityCrossReferenceLinks(entCode, caseRef);
foreach (var item in xrefs)
{
if (item.EntityRef != reference) //because the deletion won't actually happen until Dispose() is called, we could essentially queue an update for a delete item.
{
if (item.ScreenNumber == null || (item.ScreenNumber == 0 || item.ScreenNumber == 0))
{
item.ScreenNumber = 1;
}
else
{
item.ScreenNumber = item.ScreenNumber - 1;
}
_entityToCaseXref.Update(item);
}
}
ここでマークされた更新は、Session.Update()とSession.Flush()を呼び出すだけです。