나는 카테고리라는 자체 참조 엔티티를 가진다. 카테고리에는 하나 이상의 하위 카테고리가있을 수 있습니다. 카테고리에는 하위 항목이 없을 수도 있습니다.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.
}
}
난 아직도 참조의 다른면을 할당 한 후 같은 예외를 얻고을 커밋하기 전에 각 인스턴스를 저장합니다. –