Fluent nhibernate Fluent NHibernate一对一,双向HasOne不拯救孩子

Fluent nhibernate Fluent NHibernate一对一,双向HasOne不拯救孩子,fluent-nhibernate,Fluent Nhibernate,我很难与流利的nhibernate建立一对一的关系。我读过很多关于这个的帖子,似乎首选的方法是共享主键方法,其中父级和子级具有相同的主键值,子PK也是FK到父级 父类和子类都有对另一个类的引用(双向HasOne),子类被配置为从父类获取其键值 我相信我的设置是正确的,但是当我创建一个新的父对象,附加一个新的子对象,然后尝试保存它时,父对象会正确保存,并且会在子对象上更新键值,但子对象实际上不会保存到DB中 以下是课程和地图: public class Parent { public vi

我很难与流利的nhibernate建立一对一的关系。我读过很多关于这个的帖子,似乎首选的方法是共享主键方法,其中父级和子级具有相同的主键值,子PK也是FK到父级

父类和子类都有对另一个类的引用(双向HasOne),子类被配置为从父类获取其键值

我相信我的设置是正确的,但是当我创建一个新的父对象,附加一个新的子对象,然后尝试保存它时,父对象会正确保存,并且会在子对象上更新键值,但子对象实际上不会保存到DB中

以下是课程和地图:

public class Parent
{
    public virtual int ParentID { get; set; }
    public virtual string Name { get; set; }

    public virtual Child Child { get; set; }

    public virtual void Add(Child child)
    {
        child.Parent = this;
        Child = child;
    }
}

public class Child
{
    public virtual int ParentID { get; set; }
    public virtual string Name { get; set; }

    public virtual Parent Parent { get; set; }
}

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(x => x.ParentID).GeneratedBy.Identity();
        Map(x => x.Name);

        HasOne(x => x.Child).Cascade.All();
    }
}

public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        Id(x => x.ParentID).GeneratedBy.Foreign("Parent");
        Map(x => x.Name);

        HasOne(x => x.Parent).Constrained().ForeignKey();
    }
}
因此,它似乎创建了我所期望的模式。但我就是不能让孩子去救:

var parent = new Parent() { Name = "Parent_1" };
parent.Add(new Child { Name = "Child_1" });
session.Save(parent);
如上所述,这将正确保存父对象,并使用来自父对象的值更新子对象上的ParentID属性,但子对象并未实际保存到DB中,并且不会生成错误


知道我做错了什么吗?

没关系。我觉得自己很愚蠢。映射是正确的,但是您必须将保存打包到事务中,以便子对象被持久化,而我在测试应用程序中没有这样做。一旦我添加了事务,它就按预期工作了

var parent = new Parent() { Name = "Parent_1" };
parent.Add(new Child { Name = "Child_1" });
session.Save(parent);