2012-08-23 58 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()); 
} 

应该工作。