0

나는 카테고리라는 자체 참조 엔티티를 가진다. 카테고리에는 하나 이상의 하위 카테고리가있을 수 있습니다. 카테고리에는 하위 항목이 없을 수도 있습니다.Hibernate의 자체 참조 엔티티는 객체 참조에 저장되지 않은 일시적인 인스턴스 예외를 준다.

엔티티와 매핑을 만들었지 만이 예외가 계속 발생합니다.

NHibernate.TransientObjectException : 객체는 저장되지 않은 과도 인스턴스를 참조 - 그것은 자동 저장 만들 것 무언가 속성에 대한 세척 또는 세트 캐스케이드 행동 이전에 과도 인스턴스를 저장합니다.

매핑 부분에 문제가 있습니까?
모든 부모 및 자식 개체를 한 번에 저장할 수 있습니까?
도움이 될 것입니다.

다음은 코드

에게 POCO

public class Category 
{ 
    private ICollection<Topic> _topics; 
    private ICollection<Category> _childCategory; 
    private ICollection<Media> _media; 
    private Category _parentCategory; 

    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual bool IsActive { get; set; } 

    public virtual Category ParentCategory 
    { 
     get { return _parentCategory ?? (_parentCategory = new Category()); } 
     protected set { _parentCategory = value; } 
    } 

    public virtual ICollection<Category> ChildCategory 
    { 
     get { return _childCategory ?? (_childCategory = new List<Category>()); } 
     protected set { _childCategory = value; } 
    } 


    public virtual void AddChild(Category childCategory) 
    { 
     childCategory.ParentCategory = this; 
    } 
} 

매핑입니다

public class CategoryMapping : IAutoMappingOverride<Category> 
{ 
    public void Override(AutoMapping<Category> mapping) 
    { 
     mapping.Map(c => c.Name).Length(30); 
     mapping.Map(c => c.Description).Length(160); 
     mapping.References(x => x.ParentCategory) 
      .Cascade.None() 
      .Column("ParentCategoryId"); 
     mapping.HasMany(x => x.ChildCategory) 
      .Inverse().Cascade.All() 
      .KeyColumn("ParentCategoryId"); 
    } 
} 

테스트 나는 부모와 자식 카테고리를 생성하고 그들 모두를 저장하는 것을 시도하고있다 ~에서 nce.

public void CanSaveAllNewObjectGraphFromCategory() { 
    #region Categories and Child 
    var categories = new sq.Category() 
    { 
     Description = "Category1", 
     IsActive = true, 
     Name = "Categoy1" 
    }; 

    var childCat = new List<sq.Category>() { 
     new sq.Category(){ 
      Description = "ChildCategory1", 
      IsActive = true, 
      Name = "CCategoy1" 
     }, 
     new sq.Category(){ 
      Description = "ChildCategory2", 
      IsActive = true, 
      Name = "CCategoy2" 
     } 
    }; 

    foreach (var item in childCat) 
    { 
     categories.AddChild(item); 
    } 
    #endregion 

    using (var tx = _session.BeginTransaction()) 
    { 
     _catRepo.AddNewCategory(categories); 
     tx.Commit(); // Error occurs when commit is executed. 
    } 
} 

답변

0

우리는

public virtual void AddChild(Category childCategory) 
{ 
    childCategory.ParentCategory = this; 
    // add to collection as well 
    _childCategory.Add(childCategory); 
} 
+0

난 아직도 참조의 다른면을 할당 한 후 같은 예외를 얻고을 커밋하기 전에 각 인스턴스를 저장합니다. –

0

귀하의 오류 메시지가 당신에게 두 가지 옵션 주었다 참조의 양면을 할당해야합니다 :

  • 설정 캐스케이드 조치를 세척하기 전에

    • 저장 과도 인스턴스를 재산이 자동 저장 될 수있는 어떤 것에
    ,

    첫 번째 옵션은 간단하다 : 단순히 거래

    using (var tx = _session.BeginTransaction()) 
    { 
        foreach(var category in categories) 
        { 
        _session.SaveOrUpdate(category); 
        } 
        _catRepo.AddNewCategory(categories); 
        tx.Commit(); 
    }