如何将项目添加到NHibernate中的双向一对多关系中?
假设我有下面的类框和项。其中一个框包含多个项目,而一个项目只能位于一个框中。物品也知道它在哪个盒子里如何将项目添加到NHibernate中的双向一对多关系中?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,假设我有下面的类框和项。其中一个框包含多个项目,而一个项目只能位于一个框中。物品也知道它在哪个盒子里 public class Box { public virtual int BoxID {get; set:} public virtual string Name {get; set;} public virtual IList<Item> Items {get; set;} } public class Item { public virtual i
public class Box
{
public virtual int BoxID {get; set:}
public virtual string Name {get; set;}
public virtual IList<Item> Items {get; set;}
}
public class Item
{
public virtual int ItemID {get; set;}
public virtual string Name {get; set;}
public virtual Box ContainerBox {get; set;}
}
我是NHibernate的新手,但我很确定这是个坏主意。因为,当稍后从数据库中持久化一个框时,Box.Items
不会指向\u Items
,而是会被覆盖以指向其他特定于NHibernate的代理集合。因此,我认为,在持久化的框上调用Box.AddItem()
,实际上不会向框中添加新项
正确的方法是什么?我希望有一种方法可以将项目添加到更新Box.Items和Item.ContainerBox的框中,而不管该框是新的还是从数据库中持久化的。将
\u Items
更改为protected,并将流畅的映射设置为\u Items
属性,这样就可以正常工作。我已经在很多方面使用了这种技术。Fluent映射看起来像什么?我没有看到如何将受保护的成员放入lambda表达式中。以下是我所做的似乎有效的操作:HasMany(b=>b.Items)。Access.CamelCaseField(Prefix.下划线)也可以看到此页面和此页面
public class BoxMap:ClassMap<Box>
{
Id(b=>b.BoxId);
Map(b=>b.Name);
HasMany(b => b.Items)
.Inverse()
.CascadeAll();
}
public class ItemMap:ClassMap<Item>
{
Id(i=>i.ItemId);
Map(i=>i.Name);
References(i => i.ContainerBox );
}
public class Box
{
private List<Item> _Items = new List<Item>();
public virtual int BoxID {get; set:}
public virtual string Name {get; set;}
public virtual IEnumerable<Item> Items
{
get{return _Items;}
private set
{
_Items.Clear();
_Items.AddRange(value);
}
}
public void AddItem(Item i)
{
if(i.ContainerBox != null) throw new Exception("Item is already in a box!");
i.ContainerBox = this;
_Items.Add(i);
}
}