Делает кто-либо знает, как я отобразил бы объект с двумя many-many наборами того же дочернего типа.
"Нормальные" отношения будут....
tbl_Parent
col_Parent_ID
tbl_Parent_Child_Xref
col_Parent_ID
col_Child_ID
tbl_Child
col_Child_ID
Альтернативные отношения...
tbl_Parent
col_Parent_ID
tbl_Include_ParentChild_Xref
col_Parent_ID
col_Child_ID
tbl_Child
col_Child_ID
Объект и отображение похожи на это...
public partial class ParentEntity : AuditableDataEntity<ParentEntity>
{
public virtual IList<ChildEntity> Children { get; set; }
public virtual IList<ChildEntity> IncludedChildren { get; set; }
}
public partial class ParentMap : IAutoMappingOverride<ParentEntity>
{
public void Override(AutoMapping<ParentEntity> mapping)
{
mapping.Table("tbl_Parent");
mapping.HasManyToMany(x => x.Children)
.Table("tbl_Parent_Child_Xref")
.ParentKeyColumn("col_Parent_ID")
.ChildKeyColumn("col_Child_ID")
.Inverse()
.Cascade.All();
mapping.HasManyToMany(x => x.IncludedChildren)
.Table("tbl_Include_ParentChild_Xref")
.ParentKeyColumn("col_Parent_ID")
.ChildKeyColumn("col_Child_ID")
.Inverse()
.Cascade.All();
}
}
Ошибкой, которую я получаю, является "Система. NotSupportedException: не Может выяснить, какова другая сторона many-many свойства 'Children' должна быть".
Я использую NHibernate 2.1.2, FluentNhibernate 1.0.
Вы знаете, я просто снимаю здесь в темноте, но это почти звучит так, как будто ваш класс ChildEntity не известен Hibernate ... обычно именно здесь я видел сообщения такого рода. Hibernate проверяет ваш класс и видит этот класс, на который указывает ссылка (в данном случае - ChildEntity), о котором id не знает.
Возможно, вы перешли дальше и обнаружили проблему на этом этапе, но думали, что все равно увижу.
К моей великой жалости, NHibernate не может этого сделать. Подумайте об использовании другого ORM.
Fluent запутался, потому что вы дважды ссылаетесь на один и тот же родительский столбец. Это запрещено. И, насколько я могу судить по активности, которую я видел, исправление не появится в ближайшее время.
Вам придется написать несколько пользовательских расширений, чтобы заставить это работать, если это возможно.
Похоже, что FNH сбит с толку, потому что вы, кажется, сопоставляете один и тот же объект (ChildEntity) двум разным таблицам, если я не ошибаюсь.
Если вам действительно не нужно разделять два списка, возможно, использование различающего значения для каждого из ваших списков решит проблему. Ваш первый список ChildEntity будет привязан к значению различения A, а вы, например, к значению различения B.
В противном случае я, возможно, выбрал бы производный класс от вашего ChildEntity, просто чтобы не иметь то же имя, что и ChildEntity.
IList<ChildEntity> ChildEntities
IList<IncludedChildEntity> IncludedChildEntities
И оба ваших класса объектов будут идентичными.
Если вы говорите, что это работает с NH, то это может быть ошибка, как уже говорилось. Однако вы можете смешивать как сопоставления XML, так и автоматическое сопоставление с FNH. Так что, если это действительно работает в NH, возможно, это будет моим предпочтением. Но думаю, это обходное решение должно сработать.