【问题标题】:Error: Object references an unsaved transient instance错误:对象引用了未保存的瞬态实例
【发布时间】:2012-04-26 12:12:45
【问题描述】:

现在我正在使用城堡活动记录在 asp-net 上构建一个 Web 应用程序。当我试图保存具有多个关系的实体时出现错误:“对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例。类型:SupBoardModel.Entities.Output,实体:SupBoardModel.Entities.Output# 0”。在网上搜索我找到了这个错误的原因及其一些解决方案,但没有人为我工作。该关系已经有一个属性设置为 Cascade = ManyRelationCascadeEnum.All,这是网络上常见的建议之一,所以......这里有什么问题???有一段代码可以了解更多信息和理解:

 //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; }
    }
}

这个错误让我抓狂。我希望这是一种在不保存每个输出之前保存状态的方法。级联属性对我来说没有变化,所有选项(All、AllDeleteOrfan、SaveUpdate)都给我相同的结果。这种情况很常见,在http://docs.castleproject.org/%28X%281%29S%28znghcs55lveeljjvqg21vni4%29%29/Active%20Record.Getting%20Started.ashx 上提到过,但对我来说是个谜。任何人都可以帮助我吗??

谢谢 门里克

【问题讨论】:

  • 如果你这样做,它会消失吗foreach (var output in (List&lt;Output&gt;)Session["outputs"]) { state.Outputs.Add(output); output.Stateref = state; }
  • 谢谢 Firo 但它没有用,我只是遇到了同样的错误。看来这里出了点问题。

标签: nhibernate castle-activerecord castle persistent


【解决方案1】:

好的,我将 Cascade=CascadeEnum.All 放在 Output 的 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; }
}

它工作!所以只放 Cascade = ManyRelationCascadeEnum 是不够的。All 仅在父实体的关系 hasMany 中,在子实体中也是必要的。

谢谢 门里克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 2011-12-24
    • 2020-06-24
    • 2019-10-31
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多