关于nhibernate& amp;流利的nhibernate

时间:2011-09-12 16:33:28

标签: nhibernate fluent-nhibernate

我有几个问题。

  1. 我一直在阅读nhibernate初学者指南3关于使用自动映射器的流利。我之前读到了这个(我已经在我的项目中使用了自动映射器)但是我仍然不确定几件事情。
  2. 当您需要像Not.Null()那样放置,或者必须设置长度或反向某事时会发生什么。你怎么设置那些?您是否必须为具有这些设置的每个属性设置自动映射器?这种默认目的不是吗?

    1. 我也在阅读有关常见错误的内容,而且只有在您需要时才会出现一个错误。我实际上正在遭受这个问题,并且不得不解决我从来没有那么高兴的问题。
    2. 从阅读本文开始,我想知道这些类的2个映射是否明智,我需要只读它

      说我有这个

         public PlanMap()
              {
                  Table("Plans");
                  Id(x => x.Id);
      
                  Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize();
                  Map(x => x.Description).Not.Nullable().NvarcharWithMaxSize();
                  Map(x => x.Price).Not.Nullable();
                  Map(x => x.Discount).Not.Nullable();
                  Map(x => x.LengthInMonths).Not.Nullable();
      
                  References(x => x.Role).Not.Nullable();
                  HasMany(x => x.Students).Cascade.All();
      
              }
      

      那么拥有它然后拥有

      是明智的
          public ReadOnlyPlanMap()
          {
              Table("Plans");
      
      
              ReadOnly();
              SchemaAction.None();
      
      
              Id(x => x.Id);
              Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize();
              Map(x => x.Description).Not.Nullable().NvarcharWithMaxSize();
              Map(x => x.Price).Not.Nullable();
              Map(x => x.Discount).Not.Nullable();
              Map(x => x.LengthInMonths).Not.Nullable();
      
              References(x => x.Role).Not.Nullable();
              HasMany(x => x.Students).Cascade.All();
      
          }
      

      然后,当我需要ReadOnly时,我在不使用其他映射时使用该映射?我唯一看错的是重复代码。我不确定我是否可以使用继承或其他东西来解决这个问题。

      3.我在书中读到它建议不要在你的数据库中使用“auto”递增选项,而是在nhibernate中使用hi-lo one设置来处理这个。

      在书中它说如果你做了类似session.Save(object);的事情,它实际上会去和服务器联系,这会破坏工作单元。在数据库上设置“自动”递增时会发生这种情况吗?我从来没有看到过这种情况的证据,实际上我必须提交记录才能真正看到id。

      当您使用hi-lo时,您的列必须是什么数据类型?我通常用我的pk递增int。我还可以使用int吗?

      1. 最后从很多例子我看到他们通常会像这样制作他们的PK属性

        public virtual int Id { get; private set; }
        
      2. 然而在书中我经常看到

            public virtual int Id { get; set; }
        

        我认为使用私人套装是阻止人们为PK制作自己号码的方法。

1 个答案:

答案 0 :(得分:2)

如果你把它们分成不同的问题,你会更好地回答所有问题,但我会解决你的几个问题:

自动映射,自定义约定和替换

如果您的业务要求之一是大多数属性不应该为空,那么您应该通过向自动化程序提供自己的约定来使其成为默认值。请查看this blog post,了解如何执行此操作。

然后,如果您的映射需要与您的约定略有不同,那么您可以通过实现IAutoMappingOverride<T>来提供自动覆盖,其中您只需指定与约定异常的列/ ids /关系。

OverridesConventions上的FluentNHibernate wiki上的文档实际上非常好,我强烈建议您阅读它。

只读实体

如果我这样做,那么当我从一个应该只读的地方检索一个对象时,我要做的就是将NHibernate忽略,internal set属性称为IsReadonly { get; internal set; }。然后在将该属性返回给调用者之前设置该属性。

如果在存储库上有明确的Save方法,则可以检查该属性,如果它是true则不执行实际的NHibernate保存。如果您依赖NHibernate脏检查来保存会话Flush,那么您可以实现一个NHibernate监听器,如果该属性为true,则不会保存该实体。

<强>标识符

一个词(首字母缩写词)GUID; hi-lo可以工作,但它可能会变得复杂和有点挑剔。要让NHibernate正确跟踪对象,它必须具有唯一的ID。如果您正在使用自动ID,那么当您Save您的实体时以及Flush之前,NHibernate 转到数据库以获取ID。

Comb GUID解决了使用auto id和hi-lo遇到的问题,以换取在数据库和内存中占用更多空间。使用FluentNHibernate自动化时,如果您的实体具有GUID作为其Id属性的类型,它将自动使用Guid Comb strategy