我有几个问题。
当您需要像Not.Null()那样放置,或者必须设置长度或反向某事时会发生什么。你怎么设置那些?您是否必须为具有这些设置的每个属性设置自动映射器?这种默认目的不是吗?
从阅读本文开始,我想知道这些类的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吗?
最后从很多例子我看到他们通常会像这样制作他们的PK属性
public virtual int Id { get; private set; }
然而在书中我经常看到
public virtual int Id { get; set; }
我认为使用私人套装是阻止人们为PK制作自己号码的方法。
答案 0 :(得分:2)
如果你把它们分成不同的问题,你会更好地回答所有问题,但我会解决你的几个问题:
自动映射,自定义约定和替换
如果您的业务要求之一是大多数属性不应该为空,那么您应该通过向自动化程序提供自己的约定来使其成为默认值。请查看this blog post,了解如何执行此操作。
然后,如果您的映射需要与您的约定略有不同,那么您可以通过实现IAutoMappingOverride<T>
来提供自动覆盖,其中您只需指定与约定异常的列/ ids /关系。
Overrides和Conventions上的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。