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