我使用 Fluent NHibernate 作为我的 NHibernate 项目的映射机制。但是当谈到 NHibernate 3.2 时,我意识到它内置了代码映射,并且不会为 NHibernate 3.2 发布 Fluent Nhibernate 版本。
当我想为实体属性设置默认值时遇到了一个问题,我没有找到执行此操作的 API。有人可以给点建议吗?
我使用 Fluent NHibernate 作为我的 NHibernate 项目的映射机制。但是当谈到 NHibernate 3.2 时,我意识到它内置了代码映射,并且不会为 NHibernate 3.2 发布 Fluent Nhibernate 版本。
当我想为实体属性设置默认值时遇到了一个问题,我没有找到执行此操作的 API。有人可以给点建议吗?
我还没有使用代码映射,但是NHibernate.Mapping.ByCode.Impl.ColumnMapper
该类有一个方法Default(object defaultValue)
。NHibernate 的 JIRA 中的这个问题,除了指出一个警告外,还展示了如何使用它:
mapper.Class<MyDomainObject>(map => map.Property
(s => s.TermService,
pm => pm.Column(cm => cm.Default("'my default value'"))));
这是你要找的吗?
我找到了这段代码。可以帮助你。
Property(x => x.Property, m =>
{
m.Column("columnName");
// or
m.Column(c =>
{
c.Name("columnName");
c.Default("defaultValue");
c.SqlType("varchar(max)");
c.Length(SqlClientDriver.MaxSizeForLengthLimitedString + 1);
c.NotNullable(true);
c.Check("len(columnName) > 1");
c.Precision(2);
c.Scale(2);
c.Index("column_idx");
c.Unique(true);
c.UniqueKey("column_uniq");
});
m.Type<string>(); // or IUserType
m.Update(true);
m.Insert(true);
m.Formula("arbitrary SQL expression");
m.Access(Accessor.Field); // or Accessor.Property or Accessor.NoSetter
// or
m.Access(typeof(CustomAccessor));
m.OptimisticLock(false);
m.Generated(PropertyGeneration.Insert); // or PropertyGeneration.Always or PropertyGeneration.Never
m.Lazy(true);
});
首先使用数据库时,在映射中设置默认值不起作用。您必须告诉 nhibernate 使用数据库默认值。为此,首先为数据库中的列设置默认值。
之后,通过执行以下操作告诉 nhibernate 映射忽略插入时的列:
Property(x => x.PropertyName, map =>
{ map.Insert(false);
map.Column("FL_COLUMN");
map.NotNullable(true);
});