我有几个域对象,我试图使用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();
}
}
答案 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);