NHibernate赢得';t删除孤立对象

NHibernate赢得';t删除孤立对象,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有几节课是这样的 public class Token { public int Id { get; set; } public ITokenInstance Instance { get; set; } } public interface ITokenInstance { int Id { get; set; }

我有几节课是这样的

public class Token
{
    public int Id
    {
        get;
        set;
    }

    public ITokenInstance Instance
    {
        get;
        set;
    }
}

public interface ITokenInstance
{
    int Id
    {
        get;
        set;
    }

    Token Token
    {
        get;
        set;
    }
}
和映射文件


<class name="Token" >
   <id name="Id" >
      <generator class="hilo" />
   </id>

   <any name="Instance" meta-type="class" id-type="Int32" cascade="all-delete-orphan">
      <column  name="instance_type" />        
      <column name="instance_id" />
   </any>
</class>

<class name="TokenInstanceOne" >
   <id name="Id" >
      <generator class="hilo" />
   </id>

   <many-to-one name="Token" class="Token" column="token_id"/>
</class>

我有各种ITokenInstance接口的实现,都在不同的表中查找,但都使用相同的BAIC结构,如映射中所示。问题是,虽然我可以向没有实例集(null)的令牌添加新的ITokenInstance,并且它将正确更新,但我不能向已经获得实例的令牌添加新实例,然后更新它,NHibernate将添加我提供的新实例,但不会删除现在未分配的实例。比如说

Token token = Session.Get<Token>(4);
var instance = Session.Get<TokenInstanceOne>(1);
Assert.AreSame(token.Instance, instance);

var newInstance = new TokenInstanceOne();
token.Instance = newInstance;
newInstance.Token = token;
instance.Token = null;
Session.Flush();
Token-Token=Session.Get(4);
var instance=Session.Get(1);
Assert.arame(token.Instance,Instance);
var newInstance=new-TokenInstanceOne();
token.Instance=newInstance;
Token=Token;
instance.Token=null;
Session.Flush();
这将触发SQL以插入新的令牌实例,并更新令牌表以指向它,但不会删除最初设置为令牌的实例。有人知道我如何指示NHibernate从数据库中删除原始TokenInstance吗

艾德: 我错过了一些现在包含在代码示例中的内容(将原始TokenInstance的Token引用设置为null)。 也只是为了澄清这是NHibernate正在生成的SQL

  • 插入到TokenInstanceOne(token_id,id)值(@p0,@p1)中@p0='4',@p1='32768'
  • 更新令牌集实例\类型=@p0,实例\ id=@p1,其中id=@p2@p0='ClassLibrary1.TokenInstanceOne',@p1='32768',@p2='4'
  • 更新TokenInstanceOne SET token_id=@p0,其中id=@p1@p0='',@p1='1'

  • 请注意,上一次更新是设置token_id='',我需要的是NHibernate删除该行。

    对不起,我误解了您的问题

    您是否尝试过在任意一端设置reverse=“true”? 或者将级联移动到另一个类的映射


    NHibernate不实现所谓的持久垃圾收集。在某些情况下,您需要显式删除实体。级联适用于删除令牌的情况

    这是您的代码:

    var token = Session.Get<Token>(4);
    Assert.IsNotNull(token.Instance);
    
    // remove the old token
    Session.Delete(token.Instance);
    
    // assign the new token
    var newInstance = new TokenInstance();
    token.Instance = newInstance;
    newInstance.Token = token;
    
    // don't need to call update, the token is in the session.
    // (except you turned off session flush)
    // Session.Update(token);
    
    var-token=Session.Get(4);
    Assert.IsNotNull(token.Instance);
    //移除旧令牌
    删除(token.Instance);
    //分配新令牌
    var newInstance=new TokenInstance();
    token.Instance=newInstance;
    Token=Token;
    //不需要调用update,令牌在会话中。
    //(除非您关闭了会话刷新)
    //会话更新(令牌);
    
    我认为您指的是级联选项,我在any标记上设置了级联选项,但该选项不起作用。你的建议是什么?我试着将级联移动到另一边,但没有成功,不幸的是,任何或多对一都不支持反向。谢谢你的建议,非常感谢