I’m creating a model for a website top-menu structure –
I have a MenuObject model:
public class MenuObject
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual List<MenuObject> Children { get; set; }
}
and a mapping:
public mapMenu()
{
Id(x => x.Id)
.Not.Nullable();
Map(x => x.Title)
.Not.Nullable();
HasMany<MenuObject>(x => x.Children)
.AsList();
}
Basically i want to be able to create a “Top Level” Menu item then add some child items to it – in database terms, there should be a ParentId field that contains the ID of the parent Menu Item (if any – this could be null)
I’m struggling to get my head around how this should be defined in my object model. Also once i hav this configured, how would i go about saving children? Would it be something like
public void InsertChild(MenuObject parent, MenuObject child)
{
parent.Children.add(child)
session.SAve(parent)
.....
}
or would I have to save the child independantly and link it to the parent explicitly?
Edit *****
Thanks – so now i have the following in my model:
public virtual MenuObject Parent { get; set; }
public virtual List<MenuObject> Children { get; set; }
and this in the mapping:
HasMany(x => x.Children)
.AsList()
.Inverse()
.Cascade.All()
.KeyColumn("ParentId");
References(x => x.Parent, "ParentId");
I can now add children to parent itms in the following way:
oChild.Parent = oParent;
session.SaveOrUpdate(oParent);
session.Save(oChild);
transaction.Commit();
I think i’m onto a winner! Is that the best way to do it? THanks gdoron
Anyway you have to “link’ it to it’s parent, If don’t want to get exceptions…
You will have to save the child independently only if you don’t specify
Cascade.Save\All()in the mapping:You have to add a
Parentproperty to connect the “child” to it’s “Parent”.It’s mapping is:
P.S.
You don’t have to write
Not.NullableonId, It’s the defaults.