我想问一些关于Fluent NHibernate的问题,因为我正在开发近一年,但仍有一些我无法得到的东西。
第一个问题是标题所说的实体。为什么我要把它们虚拟化?
一位高级开发人员告诉我,当我有另一个对象的列表时,我应该在构造函数中初始化它,例如:
public class Category
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IEnumerable<Equipment> Equipments { get; set; }
public Category()
{
Equipments = new List<Equipment>();
}
}
这里的第一件事就是我有一个警告“虚拟成员在构造函数中调用” - 我用Google搜索但是并没有真正理解这个问题。问题的第二部分是:我必须初始化这个列表吗?也许我不必,但这是一个很好的方法:如果是这样,为什么?
第三个问题是关于映射,这是我上课的方式:
public class CategoryMap: ClassMap<Category>
{
public CategoryMap()
{
Id(x => x.Id);
Map(x => x.Name);
HasMany(x => x.Equipments);
}
}
在某些例子中,我看到了一行代码:
Table("Category");
我什么时候需要指定表格?
---- EDIT 谢谢你的回答,但现在我必须清楚一些关于延迟加载的内容。我读到了这个:http://www.codeproject.com/Articles/652556/Can-you-explain-Lazy-Loading
您可以看到具有私有字段_Orders的Customer类和该对象的公共getter(也初始化_Orders列表)。你能否告诉我这是否比我的方法更好?如果是,我应该如何更改我的代码? (由于Fluent NH,字段是虚拟的。)
答案 0 :(得分:2)
nhibernate
的属性必须是虚拟的,以便它们可以替换为代理(lazy-loading所需)您不必这样做。但是,在构造函数中初始化集合是一个好习惯,这样您就不会在代码中突然获得null
。例如,请考虑以下代码
var category = session.Get<Category>(1);
//without c-tor this line will throw exception as collection is null
var totalEquipments = category.Equipments.Count();
所以要么在构造函数中初始化它,要么继续写这个
var totalEquipments = (category.Equipments == null) ? 0 : category.Equipments.Count()
这是为了指定实体Category
应该映射到名为Category
的表。如果实体名称与默认名称不匹配,或者要清楚显示实体存储的位置,则可以使用它(有关其他属性的详细信息,请参阅fluent-wiki)