NHibernate:Id未在级联保存上更新

时间:2011-07-29 09:43:04

标签: fluent-nhibernate cascade

我有几个域对象,我试图使用Cascade功能保存。但是,当我将子项添加到父项并保存父项时,子项对象不会保存。

更新:此处代码的原始版本没有刷新会话,这可能解释了我看到的行为。但是,它没有,我更新了问题中的代码,以更好地反映实际情况。

这就是我在我的控制器和存储库中所做的事情:

// in controller
public ActionResult AddChildToParent(int id /* of parent */, ChildInputModel input)
{
    var child = GetChildFromInputModel(input); // pseudo
    var savedchild = _repo.AddChildToParent(c, id);

    // savedchild.Id is still 0, and nothing has been saved to the database.
    return View(savedchild);
}    

// in repo
public IChild AddChildToParent(IChild c, int parentId)
{
    var parent = GetParentById(parentId);
    var child = new Child();
    c.CopyValuesTo(child); // A utility function in our library
    parent.AddChild(child);

    // These two calls might be unnessesary, but I'm keeping them here to sho
    // my current code situation
    var session = GetNHibernateSession();
    session.Save(parent);

    return child;
    // session flushes when method returns thanks to injected transactions
}

在我重定向到编辑页面并且ID为0之前,我没有在应用程序中看到错误,但我在数据库中验证没有添加子记录。我没有更改父母的任何其他内容 - 只是添加一个孩子。

我在这里做错了什么?

这些是我的实体和地图(简化):

public class Parent : IParent // Interface just defines everything public
{
    public int Id { get; set; }
    public string Name { get; set; }

    private IList<Child> _children;
    public IList<Child> Children
    { 
        get 
        { return _children ?? (_children = new List<Child>()); } 
    }
    public void AddChild(Child c)
    {
         this.Children.Add(c);
         c.Parent = this;
    }
}

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(p => p.Id);
        Map(p => p.Name);

        HasMany(p => p.Children).Cascade.AllDeleteOrphan().Not.LazyLoad();
    }
}

public class Child : IChild // Interface just defines everything public
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Parent Parent { get; set; }
}

public class ChildMap : ClassMap<Child>
{
    public ChildMap() 
    {
        Id(c => c.Id);
        Map(c => c.Name);
        References(c => c.Parent).Not.Nullable();
    }
}

1 个答案:

答案 0 :(得分:0)

这是正常的:级联不会立即存储。孩子们在下一次冲洗后获得id(这可能需要一些时间,因此在每次调用AddChild后不要明确刷新)或明确保存孩子后。

var parent = GetParentById(parentId);
var child = new Child();
c.CopyValuesTo(child); // A utility function in our library
parent.AddChild(child);

var session = GetNHibernateSession();
// no need to save the parent, since it is already in the session.
// you may optionally save the child when the id is used in the code
session.Save(child);