1

需要明确的是 - 这个问题与 Fluent 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需要(我不能在' 结束时设置Inverseto )。trueParent

Parent和映射应该是Child什么样子的?

4

1 回答 1

2

我添加了以下项目:

子类:一个字段_parent,一个构造函数
父类:AddChild方法
子映射:用于父属性的manytoone
父映射:inverse(true),使子的父处理程序

完整代码:

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());
}

那应该工作。

于 2013-05-14T13:35:15.580 回答