NHibernate - доступ к родителю объекта через идентификатор или ссылку на объект - PullRequest
0 голосов
/ 21 марта 2011

У меня есть следующие классы:

public class Parent
{
    public virtual int ParentId { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<Child> Children { get; set; }
}

public class Child
{
    public virtual int ChildId { get; set; }
    public virtual string Name { get; set; }
    //public virtual int ParentId { get; set; }
    public virtual Parent Parent { get; set; }
}

Эти классы сопоставляются с соответствующими таблицами в базе данных в отношении один ко многим.В моих классах отображения я делаю следующее:

using FluentNHibernate.Mapping;
public partial class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(p => p.ParentId).Column.("PARENT_ID").GeneratedBy.Native();
        Map(p => p.Name).Column("PARENT_NAME").Not.Nullable();
        HasMany<Child>(p => p.Children).Cascade.All().LazyLoad().Inverse().AsSet();
    }
}

public partial class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        Id(c => c.ChildId).Column("CHILD_ID").GeneratedBy.Native();
        Map(c => c.Name).Column("CHILD_NAME").Not.Nullable();
        References<Parent>(c => x.Parent).Column("PARENT_ID").Not.LazyLoad().Not.Nullable();
    }
}

Что мне нужно сделать, это выставить (раскомментировать строку в определении класса выше) свойство ParentId в классе Child, чтобы я могвыполните следующие действия:

var child = new Child();
child.ParentId = 1;

То есть я хочу иметь возможность прикрепить Parent к Child через свойство child.ParentId, но при этом иметь возможность доступа к Parent через свойство child.Parent.Например,

// i currently have to do the following in order to link the child with
// the parent when I update an existing Child instance (ParentService() and 
// ChildService() are service classes that sit between my applications and
// NHibernate).
var parentService = new ParentService();
var parent = parentService.GetById(1);
var child = new Child() { ChildId = 2, Parent = parent, Name = "New Name" };
var childService = new ChildService();
childService.Save(child);

// in a different project, i access the Parent object via the child's
// Parent property
var childService = new ChildService();
var child = childService.GetById(2);
Console.WriteLine(child.Parent.Name);


// i want to do this instead
var child = new Child() { Id = 2, ParentId = 1, Name = "New Name" };
var childService = new ChildService();
childService.Save(child);
Console.WriteLine(child.Id); // 11

// [ ... ]

var childService = new ChildService();
var child = childService.GetById(2);
Console.WriteLine(child.Parent.Name);

Как бы я изменил сопоставления, чтобы это произошло?TIA,

Ральф Томпсон

1 Ответ

4 голосов
/ 22 марта 2011

Это неправильное использование NHibernate.

Чтобы получить Id родительского использования:

var parentId = child.Parent.Id; //this does not cause loading

Чтобы установить родителя по Id, используйте

child.Parent = session.Load<Parent>(parentId); //this never goes to the DB either
...