0

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

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

            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

在我的类映射中使用 Bags,我能够正确保存此消息对象,并使其正确持久。问题是在使用消息 ID 调用 Get 以返回消息时。我收到“收藏与任何会话都没有关联”

至于我的映射器,我的消息有一袋生物,其中有一袋药物。

有没有人有通过代码使用 nHibernate 映射做这种事情的例子?我的映射器中遗漏了一些东西......

4

1 回答 1

0

如果你想要双向映射,你需要做更多的事情。

所以我会在 Organism 类上定义一个消息属性。并将其映射为参考。

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

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

关于您的映射,您需要将 Message.Organisms 设置为 Bag 并将 Organism.Message 设置为 ManyToOne。对于下一个级别,只需重复此操作。

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);
        });
    }
}
于 2013-09-24T16:32:21.360 回答