Ошибка: объект ссылается на несохраненный временный экземпляр - PullRequest
0 голосов
/ 23 августа 2011

Сейчас я создаю веб-приложение в asp-net, используя активную запись Castle. Когда я пытался сохранить сущность с отношением has-many, я получил ошибку: «объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом. Тип: SupBoardModel.Entities.Output, Entity: 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, но для меня загадка. Может ли какое-нибудь тело помочь мне ??

Спасибо Menrique

1 Ответ

0 голосов
/ 23 августа 2011

Хорошо, я поставил Cascade = CascadeEnum.All в поле StateRef в Output, что-то вроде этого:

/// <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. Все только в отношении hasMany родительского объекта, также необходимо в дочернем объекте.

Спасибо Menrique

...