2011-08-22 68 views
0

现在我正在使用城堡活动记录在asp-net上构建一个Web应用程序。当我试图保存一个具有has-many关系的实体时,我得到错误:“对象引用一个未保存的瞬态实例 - 在刷新之前保存瞬态实例类型: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上提到,但对我来说是个谜。有谁能够帮助我??

感谢 Menrique

+0

会消失,如果你(在(名单)会议[ “输出”] VAR输出)做 '的foreach { state.Outputs.Add(输出); output.Stateref = state; }' – Firo

+0

感谢Firo,但它没有工作,我刚刚得到同样的错误。看起来这里有些不对。 – menrique

回答

0

好吧,我把级联= 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; } 
} 

而且它的工作!所以Cascade = ManyRelationCascadeEnum是不够的。所有关系中只有许多父实体,在子实体中也是必需的。

感谢 Menrique

相关问题