Fluent NHibernate 创建实体——为什么是虚拟的

Fluent NHibernate creating entities - why virtual

我想问一些关于 Fluent NHibernate 的问题,因为我已经用它开发了将近一年,但仍然有一些我不明白的地方。

  1. 第一个问题如标题所说,是关于实体的。为什么我要让它们虚拟?

  2. 一位高级开发人员告诉我,当我在另一个列表中有其他 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" - 我用谷歌搜索了它,但并没有真正理解这个问题。问题的第二部分是:我必须初始化这个列表吗?也许我不需要,但这是一个好方法:如果是这样,为什么?

  3. 第三个问题是关于映射的,这是我上面的方法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,字段是虚拟的。)

  1. nhibernate 的属性需要是虚拟的,以便它们可以被代理替换(lazy-loading 需要)
  2. 你不必做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()
    
  3. 这是为了指定实体 Category 应该映射到名为 Category 的 table。如果实体名称与默认名称不匹配或明确要存储实体的位置,则可以使用它(有关其他属性的详细信息,请参阅 fluent-wiki