我有poco class
public class Category : Entity<int>
{
public virtual Category Parent;
public virtual Iesi.Collections.Generic.ISet<Article> Articles {get; set;}
public virtual Iesi.Collections.Generic.ISet<Category> ChildCategories {get; set;}
}
我不确定ChildCategories属性的正确映射
public class CategoryMap : ClassMapping<Category>
{
public CategoryMap()
{
...
Set(x => x.ChildCategories,
c => { c.Cascade(Cascade.DeleteOrphans); },
r => { r.OneToMany(); }
);
}
}
任何子类别只能有一个父级。这是正确的映射吗? 如果您需要更多信息,请询问。
更新: 以下内容消息是
{"Could not determine type for: xxxx,
for columns: NHibernate.Mapping.Column(Parent)"}
更新2:
public class CategoryMap : ClassMapping<Category>
{
public CategoryMap()
{
Id(x => x.Id, m => m.Generator(Generators.GuidComb));
Property(x => x.Name, m =>
{
m.Length(255);
m.NotNullable(true);
});
Property(x => x.Parent, m =>
{
//m.NotNullable(true);
});
Set(x => x.ChildCategories,
c =>
{
c.BatchSize(25);
c.Inverse(true);
c.Cascade(Cascade.DeleteOrphans);
c.Key(k =>
{
k.Column("ParentId");
});
},
r => { r.OneToMany(); }
);
Set(x => x.Articles,
c => { c.Cascade(Cascade.DeleteOrphans); },
r => { r.OneToMany(); }
);
}
}
更新3
Property(x => x.Parent, m =>
{
m.Column("ParentId");
m.NotNullable(true);
});
错误
{"Could not determine type for: xxxx,
for columns: NHibernate.Mapping.Column(ParentId)"}
答案 0 :(得分:4)
不太确定真正的问题是什么,但我对父子集合的标准xml映射看起来像这样:
<set name="ChildCategories" lazy="true" batch-size="25" inverse="true">
<key column="ParentId" />
<one-to-many class="Category"/>
</set>
虽然lazy
(据我记得)默认,但我更喜欢明确的陈述
我想说,真正重要的是搜索 Parnet列的信息。我肯定会明确表示。还有反向和批量大小。所以,关注
这可能是集合
的映射 ...
Set(x => x.ChildCategories,
c =>
{
c.BatchSize(25);
c.Inverse(true);
c.Cascade(Cascade.DeleteOrphans);
c.Key(k =>
{
k.Column("ParentId");
};
},
r => { r.OneToMany(); }
);
有关为何使用批量调整的更多信息:How to Eager Load Associations without duplication in NHibernate?
因为我们使用(在我的代码片段中)Inverse ...父必须也被映射(并已分配)
更新:此映射的必要部分是父映射!
但Parent不是值类型属性。这是一个参考。这就是为什么我们必须像这样映射它:
ManyToOne(x => x.Parent, m =>
{
请参阅:Mapping-by-Code - ManyToOne
我们无法使用
// NOT correct mapping
Property(x => x.Parent