複合IDがエンティティを一意に識別するシナリオがあります。これらのフィールドに複数の主キーを持つようにMSSQLを定義しました。さらに、1対多の関係を参照するために自動インクリメントされたIDを使用したいと思います。スキーマは次のとおりです。
public class Character
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Region Region { get; set; }
public virtual string Realm { get; set; }
public virtual IList<CharProgression> Progression { get; set; }
}
public class CharProgression
{
public virtual int Id { get; set; }
public virtual Character Character { get; set; }
public virtual Stage Stage { get; set; }
public virtual int ProgressionPoints { get; set; }
public virtual int NumOfSaves { get; set; }
}
public class Stage
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
}
マッピングは次のようになります。
class CharacterMap : ClassMap<Character>
{
public CharacterMap()
{
Table("characters");
Id(ch => ch.Id, "id").GeneratedBy.Identity().Not.Nullable();
CompositeId().KeyProperty(ch => ch.Region, "region")
.KeyProperty(ch => ch.Realm, "realm")
.KeyProperty(ch => ch.Name, "name");
HasMany<CharProgression>(ch => ch.Progression).Inverse().Cascade.All();
}
}
class CharProgressionMap : ClassMap<CharProgression>
{
public CharProgressionMap()
{
Table("char_progression");
CompositeId().KeyReference(cprog => cprog.Character, "char_id",
.KeyReference(cprog => cprog.Stage, "stage_id");
Id(cprog => cprog.Id, "id").GeneratedBy.Identity().Not.Nullable();
Map(cprog => cprog.ProgressionPoints, "progression_points");
Map(cprog => cprog.NumOfSaves, "num_of_saves");
}
}
public class StageMap : ClassMap<Stage>
{
public StageMap()
{
Table("stages");
Id(st => st.Id, "id").GeneratedBy.Identity().Not.Nullable();
Map(st => st.Name, "name");
Map(st => st.Description, "description");
}
}
ここで、キャラクターにSaveOrUpdate()を使用し、更新に複合IDを使用したいと思います。これは、キャラクターの一意性が、リージョン、レルム、名前の3つのフィールドによって定義されるためです。ただし、CharProgressionからCharacterを参照する場合、char_progressionテーブルに文字を識別するための3つのフィールドを保持させたくないので、複合IDを使用したくありません。単純なIDで十分です...そのためです。また、CharacterエンティティにIDENTITYIDを定義しました。
私が試みていることは可能ですか?またはこれを達成する別の方法はありますか?
ありがとう :)