Ошибка при создании связи «один ко многим» во время выполнения с NHibernate? - PullRequest
1 голос
/ 20 сентября 2011

У меня есть ситуация, когда несколько частей моей модели сущности известны только во время выполнения.Чтобы создавать запросы простым способом, я хотел бы добавить простую one-to-many ассоциацию к элементам, ссылающимся на них перед созданием SessionFactory.

. Я просмотрел этот пост в Ayende'sблог и Расширение / изменение классов NHibernate во время выполнения , но я застрял при ошибке, говорящей:

Неизвестная роль коллекции: MySandbox.Parent.Children

Что такое роль сбора и как я могу указать NHibernate разрешить ее, как если бы она была добавлена ​​в hbm.xml?

Мой тест:

using (var tx = this.session.BeginTransaction())
{
    parent = new Parent() { Name = "Parent 1" };
    this.session.Save(parent);
    tx.Commit(); //<- The exception is thrown here
}

Мой коддля добавления ассоциации:

    // var cfg = <init nhibernate>

    PersistentClass cls = cfg.GetClassMapping("MySandbox.Parent");

    NHibernate.Mapping.Set value = new NHibernate.Mapping.Set(cls)
    {
        Role = cls.EntityName + ".Children",
        IsGeneric = true,
        GenericArguments = new Type[] { typeof(Child) }
    };

    NHibernate.Mapping.Property property = new NHibernate.Mapping.Property()
    {
        PropertyAccessorName = "noop",
        Value = value,
        Name = "Children",
        PersistentClass = cls
    };

    cls.AddProperty(property);

Мои классы:

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

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

Отображение ассоциации, которое я пытаюсь создать во время выполнения:

<set name="Children" access="noop">
  <key column="ParentID" />
  <one-to-many class="MySandbox.Child, MySandbox"/>
</set>

Отлично работаетесли я просто создаю ассоциацию в hbm.xml-файле.Я также попытался сравнить ассоциацию, созданную из xml, с ассоциацией, созданной с помощью приведенного выше кода, но безуспешно.

(Примечание: если я не установил свойство Role, другое исключение из «Значение не может быть выполнено»быть нулевым. Имя параметра: ключ "брошен.)

1 Ответ

0 голосов
/ 21 сентября 2011

Ошибка в том, что MySandbox.Child не отображается. Вам необходимо отобразить его (путем создания PersistentClass и т. Д.), Аналогично тому, как вы это делали для класса Parent.

...