2011-01-20 11 views
2

私たちは、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を持つオブジェクトがないことを確認しています。

任意の提案が最もいただければ幸いです:)

おかげ

答えて

0

私はマッピングが混乱しているようです。私は私のドメインのブリッジテーブルをモデリングしているので、ManyToManyマッピングを扱っていません。マッピングは次のようになります。

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.Guid(); 

     Map(p => p.Name); 

     Map(p => p.Type); 

     HasMany(p => p.ChildAccountabilities) 
      .KeyColumn("ParentId") 
      .Inverse() 
      .Cascade.All(); 

     HasMany(p => p.ParentAccountabilities) 
      .KeyColumn("ChildId") 
      .Inverse() 
      .Cascade.All(); 
    } 
} 
0

を親が子に設定されていない場合は、ヌルを得ることができます。 Childオブジェクトが追加されると、そのParentプロパティを親に設定する必要があります。

は考慮してください。

var parent = new Party(); 
var child = new Accountability(); 
parent.ChildAccountabilities.Add(child); 

親は子を知っているが、子は親の知りません。明示的に子供に親を設定してみてください:

var parent = new Party(); 
var child = new Accountability(); 
child.Parent = parent; 
parent.ChildAccountabilities.Add(child); 

ことで問題が解決した場合は、それだけでダウンし、子が追加されたときParentプロパティを設定カプセル化する方法にしています。 This blog entryが役に立ちます。

関連する問題