私たちは、NHibernateで流暢なNHibernateを使ってマップを定義するために永続化しようとしている説明責任パターンを使用してドメインモデルを実装しました。NHibernateを使用してAccountabilityパターンをSQLにマップする方法
効果的に私たちは3つのエンティティ(当事者間の関係を定義するために使用されます)、Party(当事者、連絡先、人、ビジネスなど)を定義するために使用され、AccountabilityType 「所持者」など)
地図を定義する上でレンガの壁にぶち当たっています。 ERDはこの(新しいユーザーaaarrgg画像、人生とその小さな挑戦を投稿することはできません)のように見えます
:
私はあなたがERDを把握することができますマップから願っています。
エンティティが(彼らはテストのためにダウン易しく書き直されている)は以下のように定義されています
public class AccountabilityType
{
public virtual string Id { get; set; }
public override int GetHashCode()
{
return Id.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as AccountabilityType;
if (other == null)
return false;
return other.GetHashCode() == GetHashCode();
}
}
public class Accountability
{
#region Properties
public virtual Guid Id { get; set; }
public virtual Party Parent { get; set; }
public virtual Party Child { get; set; }
public virtual AccountabilityType Type { get; set; }
#endregion
#region Methods
public override int GetHashCode()
{
return Type.GetHashCode()^Parent.GetHashCode()^Child.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as Accountability;
if (other == null)
return false;
return other.GetHashCode() == GetHashCode();
}
#endregion
}
public class Party
{
public Party()
{
ParentAccountabilities = new List<Accountability>();
ChildAccountabilities = new List<Accountability>();
}
#region Properties
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual string Type { get; set; }
// Exposed for persistence, Hackity Hack, dont hate the player hate the game
public virtual IList<Accountability> ParentAccountabilities { get; set; }
// Exposed for persistence, Hackity Hack, dont hate the player hate the game
public virtual IList<Accountability> ChildAccountabilities { get; set; }
#endregion
#region Overrides
public override int GetHashCode()
{
return Type.GetHashCode()^Name.GetHashCode();
}
public override bool Equals(object obj)
{
var other = obj as Party;
if (other == null)
return false;
return other.GetHashCode() == GetHashCode();
}
#endregion
}
そして最後に流暢なマップを次のように:
public class AccountabilityTypeMap : ClassMap<AccountabilityType>
{
public AccountabilityTypeMap()
{
Id(p => p.Id).GeneratedBy.Assigned();
}
}
public class AccountabilityMap : ClassMap<Accountability>
{
public AccountabilityMap()
{
Id(p => p.Id).GeneratedBy.Guid();
References(p => p.Parent, "ParentId").Cascade.None();
References(p => p.Child, "ChildId").Cascade.All();
References(p => p.Type, "AccountabilityTypeId").Cascade.None();
}
}
public class PartyMap : ClassMap<Party>
{
public PartyMap()
{
Id(p => p.Id).GeneratedBy.Assigned();
Map(p => p.Name);
Map(p => p.Type);
HasManyToMany(p => p.ChildAccountabilities)
.Table("Accountability")
.ParentKeyColumn("ChildId")
.ChildKeyColumn("ParentId")
.Cascade.All();
HasManyToMany(p => p.ParentAccountabilities)
.Table("Accountability")
.ParentKeyColumn("ParentId")
.ChildKeyColumn("ChildId")
.Cascade.None()
.Inverse();
}
}
エンティティは、DBへの永続化され、しかし、NHibernateはsession.Flush()にエラーをスローし、エラーはNULL IDを持つAccountabilityエンティティを挿入しようとしていることを示します。 Idはnull以外のGuidであるため、これはまず不可能です。オブジェクトモデルがnull /空のIDを持つオブジェクトがないことを確認しています。
任意の提案が最もいただければ幸いです:)
おかげ