1

次のクラスと関連するマッピングがあります (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();
    }
}

次のように2つのオブジェクトを作成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;

cCategoryには が 1 のオブジェクトが含まれていますIdが、そのChildCategoriesプロパティはnullです。

私が間違っていることは何ですか?

PS:- これは、NHibernateなどを使用した最初の実験Fluent NHibernateです。

編集:-次のものは機能しました。読み取りのためにセッションを再度開く前に、セッションを閉じる必要がありました。それ以外の場合は、@Holf が次のように追加Child Categoryする必要があると指摘したように、メモリ nad からのみ読み取ります。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();
4

2 に答える 2

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また、 with値が親カテゴリを参照していることを確認できません1。LInqプロバイダーを使用して正しいオブジェクトをロードしてください。

于 2012-05-08T02:52:25.027 に答える
0

関係の片側を処理しましたが、「cc」のParentCategoryとして「c」を割り当てることにより、逆を行った場所をどこにも見ることができません。あなたもする必要があると思います

c.ChildCategories.Add(cc);

SaveOrUpdateを実行する前に。

于 2012-05-07T19:35:36.437 に答える