NHibernate - 内存中的关联未更新

时间:2016-03-08 15:04:03

标签: c# nhibernate

我有以下问题模型:

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个实例

1 个答案:

答案 0 :(得分:0)

我无法找到以下语句的引用,但我相信NHibernate认为从已加载的one-to-many集合中删除已删除的实体不是它的责任。

如果您在已加载的类别上还有其他工作要做,则应明确删除已删除的项目,或Refresh (see end of 9.2§)类别。

如果您还有一些与当前打开的会话有关的工作,而不再了解哪个Category在其第一级缓存中保留了Items已加载并包含一些已删除的会话,并且要求此会话产生的任何Category使其Items保持最新状态,您可以在继续之前Clear会话。 (这将驱逐所有已加载的实体。)

但是,简单地完成Flush的工作单元会更好。 (关闭会话。)Category从新打开的会话加载(或附加到)会使Items更新。