我有以下问题模型:
class Item
{
public virtual int Id { get; set; }
public virtual Category Category { get; set;}
// Bi-directional mapping to simplify object traversal.
public virtual Storage Storage { get; set; }
}
class Category
{
public virtual int Id { get; set; }
// Bi-directional mapping to simplify object traversal.
public virtual IList<Item> Items { get; set; }
}
class Storage
{
public virtual int Id { get; set; }
public virtual IList<Item> Items { get; set;}
}
问题在于每当我删除包含一些Storage
个实例的Item
对象时,如下所示:
Category category = ...; // This instance already exists in the database.
Storage storage = ...; // This instance already exists in the database.
Item item = new Item();
item.Category = category; // Inverse is used on HasMany association
category.Items.add(item);
item.Storage = storage; // Inverse is used on HasMany association
storage.Items.add(item);
session.Save(storage);
session.Flush();
// HasMany association on Storage cascades delete to Item
session.Delete(Storage);
session.Flush();
Item
仍然保留在Category.Items
中。这种行为有望吗?或者是否有必要从父Item
?
Category
个实例
答案 0 :(得分:0)
我无法找到以下语句的引用,但我相信NHibernate认为从已加载的one-to-many
集合中删除已删除的实体不是它的责任。
如果您在已加载的类别上还有其他工作要做,则应明确删除已删除的项目,或Refresh
(see end of 9.2§)类别。
如果您还有一些与当前打开的会话有关的工作,而不再了解哪个Category
在其第一级缓存中保留了Items
已加载并包含一些已删除的会话,并且要求此会话产生的任何Category
使其Items
保持最新状态,您可以在继续之前Clear
会话。 (这将驱逐所有已加载的实体。)
但是,简单地完成Flush的工作单元会更好。 (关闭会话。)Category
从新打开的会话加载(或附加到)会使Items
更新。