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
请注意,上一次更新是设置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标记上设置了级联选项,但该选项不起作用。你的建议是什么?我试着将级联移动到另一边,但没有成功,不幸的是,任何或多对一都不支持反向。谢谢你的建议,非常感谢