2013-08-13 3 views
2

유창한 nhibernate에서 트리를 정의하는 데 문제가 있습니다. 전에 다른 HasMany 관계를 수행했으나 이와 같은 자체 참조는하지 않았습니다.HasMany가 null 어린이를 제공합니다.

아무리 노력해도 Children == null입니다.

법인 :

public class StockContainer 
{ 
    public virtual Guid Id { get; set; } 

    public virtual string Name { get; set; } 

    public virtual StockContainer Parent { get; set; } 
    public virtual IList<StockContainer> Children { get; set; } 

    public virtual void MoveTo(StockContainer outerContainer) 
    { 
     Parent = outerContainer; 
    } 
} 

유창함 NHibernate에 매핑 :

public class StockContainerMapping : ClassMap<StockContainer> 
{ 
    public StockContainerMapping() 
    { 
     Table("StockContainers"); 
     Id(x => x.Id); 
     Map(x => x.Name).Unique(); 
     References(n => n.Parent).LazyLoad().Nullable(); 
     HasMany(n => n.Children).KeyColumn("Parent_id").Where(x => x.Parent.Id == x.Id); 
    } 
} 

생성 테이블 :

create table StockContainers (
    Id UNIQUEIDENTIFIER not null, 
    Name TEXT unique, 
    Parent_id UNIQUEIDENTIFIER, 
    primary key (Id), 
    constraint FKB5FA0632A80E0632 foreign key (Parent_id) references StockContainers 
) 

단위 테스트 실패

[TestMethod] 
    public void Can_move_an_item() 
    { 
     var item1 = LoadByName("Item1"); //test helper function that loads items from repository 
     var item2 = LoadByName("Item2"); 

     //pair them up 
     using (var transaction = _session.BeginTransaction()) 
     { 
      item2.MoveTo(item1); 
      transaction.Commit(); 
     } 

     //reload them 
     item1 = LoadByName("Item1"); 
     item2 = LoadByName("Item2"); 

     Assert.AreEqual(item1, item2.Parent); //OK 
     Assert.IsNotNull(item1.Children);  //Fails here 
     Assert.AreEqual(1, item1.Children.Count); 
    } 
을3210
+0

어떤 쿼리가 생성됩니까? –

+0

@SimonWhitehead 문제를 발견했습니다. 그러나 관심이 없으면 생성 된 쿼리는 어디서 볼 수 있습니까? – weston

답변

0

아, 다시로드하기 전에 다른 세션을 사용해야합니다. 그렇지 않으면 같은 엔티티를 얻게됩니다.

_session = CreateSession(); //(Test class method to create session) 

    //reload them 
    var item1b = LoadByName("Item1"); 
    var item2b = LoadByName("Item2"); 

    //check we have loaded new objects 
    Assert.AreNotSame(item1, item1b); 
    Assert.AreNotSame(item2, item2b); 
관련 문제