У меня есть ситуация, когда несколько частей моей модели сущности известны только во время выполнения.Чтобы создавать запросы простым способом, я хотел бы добавить простую 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
, другое исключение из «Значение не может быть выполнено»быть нулевым. Имя параметра: ключ "брошен.)