流畅的NHibernate创建实体 - 为什么虚拟

时间:2015-05-11 14:53:56

标签: c# fluent-nhibernate

我想问一些关于Fluent NHibernate的问题,因为我正在开发近一年,但仍有一些我无法得到的东西。

  1. 第一个问题是标题所说的实体。为什么我要把它们虚拟化?

  2. 一位高级开发人员告诉我,当我有另一个对象的列表时,我应该在构造函数中初始化它,例如:

    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搜索但是并没有真正理解这个问题。问题的第二部分是:我必须初始化这个列表吗?也许我不必,但这是一个很好的方法:如果是这样,为什么?

  3. 第三个问题是关于映射,这是我上课的方式:

    public  class CategoryMap: ClassMap<Category>
    {
      public CategoryMap()
      {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany(x => x.Equipments);
      }
    }
    

    在某些例子中,我看到了一行代码:

    Table("Category");
    

    我什么时候需要指定表格?

  4. ---- EDIT 谢谢你的回答,但现在我必须清楚一些关于延迟加载的内容。我读到了这个:http://www.codeproject.com/Articles/652556/Can-you-explain-Lazy-Loading

    您可以看到具有私有字段_Orders的Customer类和该对象的公共getter(也初始化_Orders列表)。你能否告诉我这是否比我的方法更好?如果是,我应该如何更改我的代码? (由于Fluent NH,字段是虚拟的。)

1 个答案:

答案 0 :(得分:2)

  1. nhibernate的属性必须是虚拟的,以便它们可以替换为代理(lazy-loading所需)
  2. 您不必这样做。但是,在构造函数中初始化集合是一​​个好习惯,这样您就不会在代码中突然获得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的表。如果实体名称与默认名称不匹配,或者要清楚显示实体存储的位置,则可以使用它(有关其他属性的详细信息,请参阅fluent-wiki