NHibernate没有加载子对象

时间:2012-05-07 19:28:51

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping nhibernate-collections

我有以下类和相关的映射(Fluent NHibernate):

public class Category
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual Category ParentCategory { get; set; }
    public virtual IList<Category> ChildCategories { get; set; }
}

映射:

public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
        Table("Categories");

        Id(x => x.Id).Column("Id").CustomType("Int32").Access.Property()
         .CustomSqlType("int").Not.Nullable().Precision(10)
         .GeneratedBy.Identity();

        Map(x => x.Description).Column("Description").Nullable()
         .Generated.Never().CustomType(typeof (string)).Access
         .Property().Length(250);

        Map(x => x.Name).Not.Nullable().Generated.Never().CustomType("string")
         .Access.Property().Column("Name").Length(50);

        References(x => x.ParentCategory).Column("ParentCategoryId");
        HasMany(x => x.ChildCategories).KeyColumn("ParentCategoryId").Inverse()
         .AsBag().Fetch.Select();
    }
}

我按如下方式创建了两个Category对象:

var c = new Category
        {
            Name = "Ebooks",
            Description = "Contains awz, mobi, pdf, epub and other 
                electronic books"
        };
var cc = new Category
         {
            Name = "Kindle Books",
            Description = "Contains Kindle ebook reader format books 
                    (awz, mobi)",
            ParentCategory = c
         };
session.SaveOrUpdate(c);
session.SaveOrUpdate(cc);

当我尝试访问已保存的对象时:

var c = session.Load<Category>(1);
var cc = c.ChildCategories;

c包含Category对象,Id为1,但其ChildCategories属性为null

我做错了什么?

PS: - 这是我的第一次NHibernate实验,Fluent NHibernate实验。

编辑: - 以下内容有效。我需要关闭会话才能再次打开它进行阅读。否则它只是从内存中读取,因为@Holf指出我需要将Child Category添加到Category,如:

c.ChilCategories.Add(CC);

我刚刚做了如下:

var session = sf.OpenSession();
CreateCategory(session);//ADDED TWO CATEGORIES EBooks, Kindle Ebooks
session.Close();

session = sf.OpenSession();
FetchCategories(session);//READ CATEGORY EBooks AND ASSOCIATED CHILDREN
session.Close();

2 个答案:

答案 0 :(得分:0)

虽然你已经处理了这段关系的一方,但是通过将'c'指定为'cc'的ParentCategory,我无法看到你做过反向的任何地方。 我想你也需要做

c.ChildCategories.Add(CC);

在执行SaveOrUpdate之前。

答案 1 :(得分:0)

您可以将地图更新为以下内容:

public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
        Table("Categories");

        Id(x => x.Id).Column("Id").CustomType("Int32").Access.Property()
         .CustomSqlType("int").Not.Nullable().Precision(10)
         .GeneratedBy.Identity();

        Map(x => x.Description).Column("Description").Nullable()
         .Generated.Never().CustomType(typeof (string)).Access
         .Property().Length(250);

        Map(x => x.Name).Not.Nullable().Generated.Never().CustomType("string")
         .Access.Property().Column("Name").Length(50);

        References(x => x.ParentCategory).Column("ParentCategoryId");
        HasMany(x => x.ChildCategories).KeyColumn("ParentCategoryId").Inverse()
         .Cascade.All();
    }
}

此外,您无法确定值为Id的{​​{1}}是否指向父类别,请使用LInq提供程序加载正确的对象。