2012-08-23 69 views
1

只是要清楚 - 這個問題不是關於流利NHibernate。代碼的雙向NHibernate映射

我有一個ParentChild類,它們之間有一對多的關係。

代碼縮短以提高可讀性。

public class Child 
{ 
    int Id; 
    string Name; 
} 

public class Parent 
{ 
    int Id; 
    string Name; 
    Iesi.Collections.Generic.ISet<Child> Children; 
} 

public ChildMapping() 
{ 
    Table("Children"); 

    Id(p => p.Id, m => { 
     m.Column("Id"); 
     m.Generator(Generators.Identity); 
    }); 

    Property(p => p.Name, m => { 
     m.Column("Name"); 
     m.NotNullable(true); 
    }); 
} 

public ParentMapping() 
{ 
    Table("Parents"); 

    Id(p => p.Id, m => { 
     m.Column("Id"); 
     m.Generator(Generators.Identity); 
    }); 

    Property(p => p.Name, m => { 
     m.Column("Name"); 
     m.NotNullable(true); 
    }); 

    Set(p => p.Children, m => { 
     m.Cascade(Cascade.All | Cascade.DeleteOrphans); 
     m.Key(k => { 
      k.Column("ParentId"); 
      k.NotNullable(true); 
     }); 
    }, a => a.OneToMany()); 
} 

Child類需要就可以了Parent屬性。 Parent需要控制關係(我不能在Parent的末尾設置Inversetrue)。

ParentChild映射應該如何映射?

+2

你可能會發現這個系列的博客文章有用;它實際上是我能找到的映射代碼的唯一文檔。 http://notherdev.blogspot.co.il/2012/02/nhibernates-mapping-by-code-summary.html –

+0

謝謝。這也是我找到的唯一文檔,但對我沒有多大幫助。如果我設法解決這個問題,我會自己回答這個問題:) –

+0

好吧,父映射似乎沒問題,難道你不需要在兒童端使用「多對一」,就是這樣嗎? –

回答

2

我已經添加了以下項目:

子類:場_parent,構造
父類:方法的AddChild
兒童映射:多對一的parent屬性
父映射:逆(真),以使孩子們的家長處理

完整代碼:

public class Child 
{ 
    int Id; 
    string Name; 
    Parent _parent; 

    public Child(Parent parent) 
    { 
    _parent = parent; 
    } 
} 

public class Parent 
{ 
    int Id; 
    string Name; 
    Iesi.Collections.Generic.ISet<Child> Children; 

    public virtual Child AddChild() 
    { 
     Child newChild = new Child(this); //link parent to child via constructor 
     Children.Add(newChild); //add child to parent's collection 
     return newChild; //return child for direct usage 
    } 
} 

public ChildMapping() 
{ 
    Table("Children"); 

    Id(p => p.Id, m => { 
     m.Column("Id"); 
     m.Generator(Generators.Identity); 
    }); 

    Property(p => p.Name, m => { 
     m.Column("Name"); 
     m.NotNullable(true); 
    }); 

    ManyToOne(x => x.Parent, map => { 
     map.Column("Id"); /* id of the parent table */ 
     map.Access(Accessor.Field); 
     map.NotNullable(true); 
     map.Class(typeof(Parent)); 
     });  
} 

public ParentMapping() 
{ 
    Table("Parents"); 

    Id(p => p.Id, m => { 
     m.Column("Id"); 
     m.Generator(Generators.Identity); 
    }); 

    Property(p => p.Name, m => { 
     m.Column("Name"); 
     m.NotNullable(true); 
    }); 

    Set(p => p.Children, m => { 
     m.Cascade(Cascade.All | Cascade.DeleteOrphans); 
     m.Key(k => { 
      k.Column("Id"); /* id of the child table */ 
      k.NotNullable(true); 
      k.Inverse(true); /* makes the parent handle it's childlist */ 
     }); 
    }, a => a.OneToMany()); 
} 

應該工作。