如何通过Fluent nHibernate将记录插入自引用表?

时间:2015-08-27 06:39:51

标签: c# sql-server recursion nhibernate fluent-nhibernate

我用Fluent nhibernate创建了一个自引用类别表[MsSQL 2012],在测试期间,我刚刚通过SSMS手动添加数据; “但现在我希望通过代码来实现,我有点迷失了?”

public class CategoryMap : ClassMap<CategoryPartRecord> {
    public CategoryMap() {
        Table("Ceck_CategoryPartRecord");
        Id(x => x.Id).GeneratedBy.Native();

        Map(x => x.Name);

        //Relationships-
        // Recursive:
        // [Category]---<[Category]
        References(x => x.ParentCategory)
        HasMany(x => x.Categories)
            .Inverse()
            .Cascade.All();
    }
}

我尝试了两种方法:

using (var transactionB = session.BeginTransaction())
{
CategoryPartRecord Cat1 = new CategoryPartRecord() { Name = "Exterior" };
CategoryPartRecord Cat2 = new CategoryPartRecord() { Name = "Interior" };
CategoryPartRecord Cat3 = new CategoryPartRecord() { Name = "Garden" };

CategoryPartRecord Cat4 = new CategoryPartRecord() { Name = "Paint" };

Cat1.Categories.Add(Cat4);

session.Save(Cat1);
session.Save(Cat2);
session.Save(Cat3);
transactionB.Commit();
}

using (var transactionBB = session.BeginTransaction()) 
{
var Cat = session.Load<CategoryPartRecord>(1); //Contains "Exterior"
CategoryPartRecord Cat2 = new CategoryPartRecord() { Name = "Paint" };

Cat.Categories.Add(Cat2);

session.Save(Cat);
transactionBB.Commit();
}

两者都添加包含“Paint”的新记录,但是没有正确链接关系,因为“CategoryPartRecord_id”总是为NULL - 我错过了一些非常明显的东西,因为它们都不起作用?

1 个答案:

答案 0 :(得分:1)

嗯,冒险猜测反转递归会更有趣,所以为了消除任何有趣的行为,改变你的映射,让我知道你是如何进行的?

        References(x => x.ParentCategory).Cascade.SaveUpdate();

        HasMany(x => x.Categories)
            .Cascade.SaveUpdate();