2017-03-17 90 views
0

所以我创建了一个新的简单项目,只是为了帮助一个朋友。 所以我做了一个客户,其中有一个东西列表流利的NHibernate映射与HasMany不能返回子集合

到目前为止好,现在与映射和存储关系。我就按照功能NHibernate类映射到地图,并结束了与以下

public class CustomerMap : ClassMap<Customer> { 
    Id(p => p.Id).GenerateBy.Guid(); 
    HasMany(p => p.Stuff).Access.CamelCaseField().KeyColumn("Id").Inverse().Cascade.AllDeleteOrphan(); 
} 

public class StuffMap : ClassMap<Stuff> { 
    Id(p => p.Id).GeneratedBy.Guid(); 
    Reference(p => p.Customer).Column("CustomerId).Not.Nullable(); 
} 

和我的课

public class Customer { 
    private ISet<Stuff> stuff = new HashSet<Stuff>() 
    public virtual IEnumerable<Stuff> Stuff => stuff; 
    public void AddStuff(Stuff newstuff) { 
     newstuff.Customer = this; 
     stuff.Add(stuff); 
    } 
} 

public class Stuff { 
    public virtual Customer Customer { get; set; } 
} 

这一切工作很好,当我创建一个新的客户,并添加更多的一个使用AddStuff方法将元素添加到集合中,并提交它正确写入数据库的事务。

但是现在的怪开始,当我提出类似下面的

[TestMethod] 
public void TestStuffAndCustomer() { 
    var customer = session.Add(new Customer()); 
    customer.AddStuff(new Stuff()); 
    session.Flush(); 

    var customer = session.Query<Customer>().Single(); 
    customer.Stuff.Should().HaveCount(1); 
} 

集合的断言测试失败原因,收集的计数为0。但是,如果我调试测试和检查它包含一个元素的集合。无论如何,断言失败。

那么这个设置有什么问题?

回答

0

我想你在会话中向客户添加新的Customer和Stuff,但不保存会话。

+0

我已经尝试提交会话并为断言打开一个新的而不是只是冲洗。更好的似乎工作,或它的作品,因为这两个元素得到保存,但我似乎无法检查断言中的东西数量。 –

+0

您可以更改.Inverse()。Cascade.AllDeleteOrphan();到.Inverse()。Cascade.SaveOrUpdate()然后。 – eyildiz

+0

试过它根本没有改变它。奇怪的是,我可以在debugmode中检查提取的Customer,并看到Stuff列表包含一个元素,但断言失败。 –