2011-08-22 4 views
0

이제 성 활성 레코드를 사용하여 asp-net에서 웹 응용 프로그램을 작성하고 있습니다. 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

+0

당신이 ((목록 ) 세션 [ "출력"]에 var에 출력) 'foreach 문을 수행 할 경우이 사라 않습니다 { state.Outputs.Add (출력); output.Stateref = 상태; }' – Firo

+0

감사합니다. Firo가 작동하지 않았지만 방금 같은 오류가 발생했습니다. 여기 보이는 것은 잘못된 것입니다. – menrique

답변

0

좋아, 나는 출력의 StateRef 필드에 그런 일 캐스케이드 = CascadeEnum.All을 넣어 :

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

관련 문제