关于nhibernate&;流畅的纤维酸盐

关于nhibernate&;流畅的纤维酸盐,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有几个问题 我一直在阅读nhibernate初学者指南3中关于使用fluent自动映射器的内容。我以前读过这篇文章(我已经在我的项目中使用了自动映射器),但是我仍然不确定有几件事 当您需要像Not.Null()一样放置,或者必须设置长度,或者在某个对象上反转时会发生什么。你是怎么设置的?您不需要为每个具有这些设置的属性设置自动映射器吗?这难道不是目的吗 我也读过一些常见的错误,其中一个错误是当你需要只读的时候。事实上,我正遭受着这个问题的折磨,不得不做出一个我从来没有那么高兴的修复 通过阅读本

我有几个问题

  • 我一直在阅读nhibernate初学者指南3中关于使用fluent自动映射器的内容。我以前读过这篇文章(我已经在我的项目中使用了自动映射器),但是我仍然不确定有几件事
  • 当您需要像Not.Null()一样放置,或者必须设置长度,或者在某个对象上反转时会发生什么。你是怎么设置的?您不需要为每个具有这些设置的属性设置自动映射器吗?这难道不是目的吗

  • 我也读过一些常见的错误,其中一个错误是当你需要只读的时候。事实上,我正遭受着这个问题的折磨,不得不做出一个我从来没有那么高兴的修复
  • 通过阅读本文,我想知道是否明智的做法是将这些类的两个映射设置为只读

    说我有这个

       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();
    
        }
    
    那么,当我需要只读时,我使用该映射,当我不使用其他映射时?我唯一认为错误的是重复的代码。我不确定我是否可以使用继承或其他方法来解决这个问题

    3.我在书中读到,它建议不要在数据库中使用“自动”递增选项,而是使用nhibernate中的hi-lo-one设置来处理此问题

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

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

  • 最后,从大量的例子中,我看到他们通常会这样做他们的PK属性

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

        public virtual int Id { get; set; }
    

    我认为使用私人设置是阻止人们为PK制作自己的号码的一种方式。

    如果你将所有问题分成几个单独的问题,你会有更好的运气得到回答,但我还是要回答你的几个问题:

    自动映射、自定义约定和覆盖

    如果您的业务需求之一是大多数属性不应为null,那么您应该通过向automapper提供您自己的约定来将其设置为默认值。看看你是如何做到这一点的

    然后,如果您的映射需要与约定稍有不同,则可以通过实现
    IAutoMappingOverride
    来提供自动映射覆盖,其中仅指定与约定不同的列/id/关系

    FluentNHibernate wiki上的文档非常好,我强烈建议您阅读

    只读实体

    如果我这样做,我要做的是忽略一个NHibernate,
    内部集
    属性,称为类似
    IsReadonly{get;internal set;}
    ,当从某个地方检索到一个对象时,它应该是只读的,然后在将其返回给调用方之前设置该属性

    如果在存储库上有显式的
    Save
    方法,则可以检查该属性,如果
    true
    ,则不执行实际的NHibernate保存。如果依赖NHibernate脏检查在会话
    Flush
    上保存,则可以实现一个NHibernate侦听器,如果该属性为
    true
    ,则该侦听器不会保存实体

    标识符

    一个单词(首字母缩写)GUID;hi-lo可以工作,但它可能会变得复杂和有点挑剔。要使NHibernate正确跟踪对象,它必须具有唯一的ID。如果您使用的是自动ID,则NHibernate将在
    保存
    您的实体时以及在执行
    刷新
    之前前往数据库获取ID


    Comb-guid解决了使用autoid和hi-lo时遇到的问题,交换条件是在数据库和内存中占用更多的空间。使用FluentNHibernate自动映射时,如果实体的
    Id
    属性类型为GUID,它将自动使用。

    那么您认为所有PK都应该使用GUID吗?如果不设置自动id会发生什么?保存时它是否仍会转到数据库?如果继续保存以检查id,但在较长时间内未进行提交,又会发生什么情况。比如说,由于某种原因,你让线程休眠了5分钟,同时还有其他东西保存并提交了。现在会不会有冲突,因为我认为它们都有相同的id。@chobo2是的,我觉得所有主键都应该使用GUID。由于没有两个GUID生成器,即使它们在时间或空间上是分开的,GUID生成器也不会生成冲突的ID,因此客户端本身可以创建ID,而无需与服务器通信。我不确定在你睡觉的时候,其他的东西会如何保存和提交你的实体,但是如果它真的发生了,这正是乐观并发的全部内容,请与NHibernate一起阅读它。对于只读的东西,我正在这样做。相反,我让它们通过session.Readonly()完成,但你的解决方案和我得到的解决方案的问题是,如果你得到了一个集合,你必须循环使用每个集合并使其成为只读。我也不明白你所说的“显式保存”是什么意思。你是说,如果我说我得到了一个提交,并且既然实体已经更改,它将提交这些更改,即使它们应该是只读的?