Изменение стратегии выборки для сопоставления мешков для присоединения сгенерирует запрос на объединение, например:
Bag(
e => e.Children,
map => {
map.Key(km => km.Column("ParentId"));
// map.Lazy(CollectionLazy.NoLazy);
// change fetch str
map.Fetch(CollectionFetchMode.Join);
map.Cascade(Cascade.Persist);
map.Inverse(true);
},
x => x.OneToMany()
);
И у вас есть коллекция, сохраняемая как обратная (map.Inverse(true);
), у вас должно быть многона одно отображение для Parent
в вашем Child
классе, например:
public class Child {
public virtual int Id { get; set; }
// public virtual string ParentId { get; set; }
public virtual Parent Parent { get; set; }
public virtual string Name { get; set; }
}
Затем сопоставьте свойство Parent
как ManyToOne
, например:
public ChildMapping() {
// other mapping goes here
ManyToOne(
x => x.Parent,
map => {
map.Column("ParentId");
map.Class(typeof(Parent));
map.Fetch(FetchKind.Join);
}
);
}
Но nhibernateне включайте дочерние элементы родительского по умолчанию (может быть, это слишком тяжело), и если вы хотите запросить дочерние элементы с родительским экземпляром, вы можете сделать запрос следующим образом:
using (var session = OpenSession()) {
var query = session.Query<Parent>().Select(p => new {
Parent = p, Children = p.Children
});
var data = query.ToList();
}
Для сохранения сущностей в базе данных, следует сделатькак это:
try {
// save parent first
var parent = new Parent();
parent.Name = "Parent object";
session.Save(parent);
// then save child
var child = new Child();
child.Name = "Child object";
child.Parent = parent;
session.Save(child);
session.Flush();
tx.Commit();
}
catch (Exception) {
tx.Rollback();
throw;
}