Fluent NHibernate 创建实体——为什么是虚拟的
Fluent NHibernate creating entities - why virtual
我想问一些关于 Fluent NHibernate 的问题,因为我已经用它开发了将近一年,但仍然有一些我不明白的地方。
第一个问题如标题所说,是关于实体的。为什么我要让它们虚拟?
一位高级开发人员告诉我,当我在另一个列表中有其他 object 列表时,我应该在构造函数中初始化它,例如:
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>();
}
}
这里的第一件事是我有一个警告 "Virtual member called in constructor" - 我用谷歌搜索了它,但并没有真正理解这个问题。问题的第二部分是:我必须初始化这个列表吗?也许我不需要,但这是一个好方法:如果是这样,为什么?
第三个问题是关于映射的,这是我上面的方法class:
public class CategoryMap: ClassMap<Category>
{
public CategoryMap()
{
Id(x => x.Id);
Map(x => x.Name);
HasMany(x => x.Equipments);
}
}
在一些例子中我看到了一行代码:
Table("Category");
什么时候需要指定 table?
----编辑
感谢您的回答,但现在我必须清除更多关于延迟加载的内容。我读到这个:http://www.codeproject.com/Articles/652556/Can-you-explain-Lazy-Loading
并且您可以看到一个 class 具有私有字段 _Orders 的客户和 object 的 public getter(它还初始化了 _Orders 列表)。你能告诉我这是否比我的方法更好吗?如果是,我应该如何更改我的代码? (由于 Fluent NH,字段是虚拟的。)
nhibernate
的属性需要是虚拟的,以便它们可以被代理替换(lazy-loading 需要)
你不必做that.However,在构造函数中初始化集合是一个很好的做法,这样你就不会在代码中突然得到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
的 table。如果实体名称与默认名称不匹配或明确要存储实体的位置,则可以使用它(有关其他属性的详细信息,请参阅 fluent-wiki)
我想问一些关于 Fluent NHibernate 的问题,因为我已经用它开发了将近一年,但仍然有一些我不明白的地方。
第一个问题如标题所说,是关于实体的。为什么我要让它们虚拟?
一位高级开发人员告诉我,当我在另一个列表中有其他 object 列表时,我应该在构造函数中初始化它,例如:
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>(); } }
这里的第一件事是我有一个警告 "Virtual member called in constructor" - 我用谷歌搜索了它,但并没有真正理解这个问题。问题的第二部分是:我必须初始化这个列表吗?也许我不需要,但这是一个好方法:如果是这样,为什么?
第三个问题是关于映射的,这是我上面的方法class:
public class CategoryMap: ClassMap<Category> { public CategoryMap() { Id(x => x.Id); Map(x => x.Name); HasMany(x => x.Equipments); } }
在一些例子中我看到了一行代码:
Table("Category");
什么时候需要指定 table?
----编辑 感谢您的回答,但现在我必须清除更多关于延迟加载的内容。我读到这个:http://www.codeproject.com/Articles/652556/Can-you-explain-Lazy-Loading
并且您可以看到一个 class 具有私有字段 _Orders 的客户和 object 的 public getter(它还初始化了 _Orders 列表)。你能告诉我这是否比我的方法更好吗?如果是,我应该如何更改我的代码? (由于 Fluent NH,字段是虚拟的。)
nhibernate
的属性需要是虚拟的,以便它们可以被代理替换(lazy-loading 需要)你不必做that.However,在构造函数中初始化集合是一个很好的做法,这样你就不会在代码中突然得到
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
的 table。如果实体名称与默认名称不匹配或明确要存储实体的位置,则可以使用它(有关其他属性的详细信息,请参阅 fluent-wiki)