nHibernate代码映射-如何用嵌套集合填充对象树

nHibernate代码映射-如何用嵌套集合填充对象树,nhibernate,mapping-by-code,Nhibernate,Mapping By Code,我似乎找不到一个很好的例子来说明我想做什么,通过代码使用nHibernate映射: 我有一个对象“Message”,它有一个“有机体”列表,每个“有机体”都有一个“药物”列表。请原谅我下面的伪示例: public class Message List<Organism> Organisms; public class Organism List<Drugs> Drugs;

我似乎找不到一个很好的例子来说明我想做什么,通过代码使用nHibernate映射:

我有一个对象“Message”,它有一个“有机体”列表,每个“有机体”都有一个“药物”列表。请原谅我下面的伪示例:

            public class Message
            List<Organism> Organisms;

            public class Organism
            List<Drugs> Drugs;

            public class Drug

            //create our tree structure

            var message=new Message();

            var drug = new Drug();
            var organism = new Organism();
            organism.Drugs.Add(drug);

            message.Organisms.Add(organism); //now we have a message with one organism child with one drug drug
公共类消息
列出生物;
公营生物
列出药物清单;
公营药品
//创建我们的树结构
var message=新消息();
var药物=新药();
var有机体=新有机体();
生物体。药物。添加(药物);
message.org.Add(生物体)//现在我们有一个信息,一个有机体,一个孩子,一种药物
使用类映射中的包,我能够正确地保存此消息对象,并使其正确地持久化。问题在于使用消息ID调用Get以返回消息时。我得到“集合与任何会话都没有关联”

至于我的制图员,我的信息里有一袋有机体,里面有一袋毒品


有没有人举过这样一个例子,通过代码实现nHibernate映射?我的映射器中缺少一些东西…

如果您想要双向映射,则需要多做一些工作

因此,我将在有机体类上定义一个消息属性。并将其映射为参考

在集合类的父类上添加添加/删除属性,以便可以将元素添加到列表中,并将此引用添加到子对象

public class Message
{
    public Int32 Id { get; set; }
    public IList<Organism> Organisms { get; protected set; }

    public Message()
    {
        Organisms = new List<Organism>();
    }

    public void AddOrganism(Organism organism)
    {
        if (Organisms.Contains(organism))
            return;

        organism.Message = this;
        Organisms.Add(organism);
    }

    public void RemoveOrganism(Organism organism)
    {
        if (!Organisms.Contains(organism))
            return;

        Organisms.Remove(organism);
    }
}

public class Organism 
{
    public Int32 Id {get;set;}
    public Message Message { get; set; }
}

谢谢你的建议,弗兰。有几件事。。。我应该明确指出,我真的不需要双向映射,只有一个方向的映射就可以了。我更好奇的是如何将这三个对象映射到一起。所以信息中有几个有机体,它们有几种药物。在你们的例子中,你们只是有了信息和有机体。非常感谢。我没有添加下一个级别,因为它与上面显示的相同。只需将包映射添加到有机体中,并引用药物即可。药物图将与答案中的生物体图完全相同。
public class MessageMap
{
    public MessageMap()
    {
        Bag(x => x.Organisms, map =>
        {
            map.Key(k =>
            {
                k.Column(col => col.Name("MessageId"));
            });
            map.Cascade(Cascade.All | Cascade.DeleteOrphans);
        },
        action => action.OneToMany());
    }
}

public class OrganismMap
{
    public OrganismMap()
    {
        ManyToOne(x => x.Message, map =>
        {
            map.Column("MessageId");
            map.NotNullable(false);
        });
    }
}