Nhibernate 错误:对象引用未保存的临时实例

Nhibernate 错误:对象引用未保存的临时实例,nhibernate,castle-activerecord,castle,persistent,Nhibernate,Castle Activerecord,Castle,Persistent,现在,我正在使用castle active record在asp网上构建一个web应用程序。当我试图保存一个具有has-many关系的实体时,我遇到了一个错误:“对象引用了一个未保存的临时实例-在刷新之前保存临时实例。类型:SupBoardModel.Entities.Output,实体:SupBoardModel.Entities.Output#0”。在网上搜索,我找到了这个错误的原因和一些解决方案,但没有人为我工作。该关系已经有一个属性设置为Cascade=ManyRelationCasca

现在,我正在使用castle active record在asp网上构建一个web应用程序。当我试图保存一个具有has-many关系的实体时,我遇到了一个错误:“对象引用了一个未保存的临时实例-在刷新之前保存临时实例。类型:SupBoardModel.Entities.Output,实体:SupBoardModel.Entities.Output#0”。在网上搜索,我找到了这个错误的原因和一些解决方案,但没有人为我工作。该关系已经有一个属性设置为Cascade=ManyRelationCascadeEnum.All,这是web上常见的建议之一,因此。。。这里怎么了???有一段代码可用于了解更多信息和理解:

 //In some part of my application
 State state = new State();

 //Set some fields
 //...
 state.Outputs = (List<Output>)Session["outputs"]; //Collection filled on a web form but not saved yet

 //Here is the error
 state.SaveAndFlush(); // Booom!!!!


//Part of a definition of Output(child entity)
[Serializable, ActiveRecord(Table = "SUPB_OUTPUTS")]
public class Output : ActiveRecordBase<Output>
{
    private int _id;

    /// <summary>
    /// Primary key
    /// </summary>
    [PrimaryKey(PrimaryKeyType.SeqHiLo, "OUTPUT_ID", SequenceName = "SEQ_OUTPUT_ID")]
    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    private string _label;

    /// <summary>
    /// Output custom label
    /// </summary>
    [Property("OUTPUT_LABEL")]
    public string Label
    {
        get { return _label; }
        set { _label = value; }
    }

    private State _state;

    /// <summary>
    /// StateRef owner (An output is only available for one state)
    /// </summary>
    [BelongsTo("OUTPUT_ID_STATE", Lazy = FetchWhen.OnInvoke)]
    public State StateRef
    {
        get { return _state; }
        set { _state = value; }
    }
}


// Part of a definition of State(parent entity)
[Serializable, ActiveRecord(Table = "SUPB_STATES")]
public class State : ActiveRecordBase<State>
{
    private int _id;

    /// <summary>
    /// Primary key
    /// </summary>
    [PrimaryKey(PrimaryKeyType.SeqHiLo, "STATE_ID", SequenceName = "SEQ_STATE_ID")]
    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    private string _name;

    /// <summary>
    /// StateRef name
    /// </summary>
    [Property("STATE_NAME")]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    private string _description;

    /// <summary>
    /// StateRef description
    /// </summary>
    [Property("STATE_DESC")]
    public string Description
    {
        get { return _description; }
        set { _description= value; }
    }

    private IList<Output> _outputs;

    /// <summary>
    /// State outputs (Columns to display data)
    /// </summary>
    [HasMany(typeof(Output), Table = "SUPB_OUTPUTS", ColumnKey = "OUTPUT_ID_STATE", Lazy = true, Cascade = ManyRelationCascadeEnum.All)]
    public IList<Output> Outputs
    {
        get { return _outputs; }
        set { _outputs = value; }
    }
}
//在我的应用程序的某些部分
状态=新状态();
//设置一些字段
//...
state.Outputs=(列表)会话[“Outputs”]//已在web表单上填写集合,但尚未保存
//这里是错误
state.SaveAndFlush();//嘘!!!!
//输出定义的一部分(子实体)
[可序列化的ActiveRecord(Table=“SUPB_输出”)]
公共类输出:ActiveRecordBase
{
私人内部id;
/// 
///主键
/// 
[PrimaryKey(PrimaryKeyType.SeqHiLo,“输出ID”,SequenceName=“SEQ\u输出ID”)]
公共整数Id
{
获取{return\u id;}
设置{u id=value;}
}
私有字符串标签;
/// 
///输出自定义标签
/// 
[属性(“输出标签”)]
公共字符串标签
{
获取{return\u label;}
设置{u label=value;}
}
私营国家;
/// 
///StateRef所有者(一个输出仅可用于一个状态)
/// 
[BelongsTo(“OUTPUT\u ID\u STATE”,Lazy=FetchWhen.OnInvoke)]
公共状态参考
{
获取{return\u state;}
设置{u state=value;}
}
}
//国家定义的一部分(母实体)
[可序列化的ActiveRecord(Table=“SUPB_STATES”)]
公共类状态:ActiveRecordBase
{
私人内部id;
/// 
///主键
/// 
[PrimaryKey(PrimaryKeyType.SeqHiLo,“STATE\u ID”,SequenceName=“SEQ\u STATE\u ID”)]
公共整数Id
{
获取{return\u id;}
设置{u id=value;}
}
私有字符串\u名称;
/// 
///StateRef名称
/// 
[财产(“州名称”)]
公共字符串名
{
获取{return\u name;}
设置{u name=value;}
}
私有字符串描述;
/// 
///StateRef描述
/// 
[财产(“状态描述”)]
公共字符串描述
{
获取{return\u description;}
设置{u description=value;}
}
私人IList_产出;
/// 
///状态输出(显示数据的列)
/// 
[HasMany(typeof(Output),Table=“SUPB\u OUTPUTS”,ColumnKey=“Output\u ID\u STATE”,Lazy=true,Cascade=ManyRelationCascadeEnum.All)]
公共IList产出
{
获取{返回_输出;}
设置{u outputs=value;}
}
}
这个错误让我发疯。我希望这是一种保存状态的方法,而不必在保存之前保存每个输出。cascade属性对我来说没有变化,所有选项(all、AllDeleteOrfan、SaveUpdate)都给出相同的结果。这个案例很常见,在上一篇文章中提到过,但对我来说是个谜。有人能帮我吗

谢谢
Menrique

好的,我将Cascade=CascadeEnum.All放在输出的StateRef字段中,类似这样:

/// <summary>
/// StateRef owner (An output is only available for one state)
/// </summary>
[BelongsTo("OUTPUT_ID_STATE", Lazy = FetchWhen.OnInvoke, Cascade=CascadeEnum.All)]
public State StateRef
{
    get { return _state; }
    set { _state = value; }
}
//
///StateRef所有者(一个输出仅可用于一个状态)
/// 
[BelongsTo(“OUTPUT\u ID\u STATE”,Lazy=FetchWhen.OnInvoke,Cascade=Cascade enum.All)]
公共状态参考
{
获取{return\u state;}
设置{u state=value;}
}
而且它工作!!!因此,仅放置Cascade=ManyRelationCascadeEnum是不够的。仅关系中的所有项都有许多父实体,子实体中的所有项也是必需的

谢谢
Menrique

如果您执行foreach(在(列表)会话[“outputs”]中的var输出){state.outputs.Add(output);output.Stateref=state;},它会消失吗?谢谢Firo,但它不起作用,我刚刚收到了相同的错误。看来这里出了点问题。