我使用Fluent NHibernate作为我的NHibernate项目的映射机制。但是当涉及到NHibernate 3.2时,我意识到它已经内置了代码映射,并且NHibernate 3.2将不会发布Fluent Nhibernate发行版。如何使用按代码映射为nhibernate 3.2中的表列设置默认值?
当我想为实体属性设置默认值时,我遇到了一个问题,我没有找到API来做到这一点。任何人都可以提供一些建议吗?
我使用Fluent NHibernate作为我的NHibernate项目的映射机制。但是当涉及到NHibernate 3.2时,我意识到它已经内置了代码映射,并且NHibernate 3.2将不会发布Fluent Nhibernate发行版。如何使用按代码映射为nhibernate 3.2中的表列设置默认值?
当我想为实体属性设置默认值时,我遇到了一个问题,我没有找到API来做到这一点。任何人都可以提供一些建议吗?
我还没有使用代码映射,但NHibernate.Mapping.ByCode.Impl.ColumnMapper
类有一个方法Default(object defaultValue)
。 This issue在NHibernate的JIRA,除了指出一个警告,说明如何使用它:
mapper.Class<MyDomainObject>(map => map.Property
(s => s.TermService,
pm => pm.Column(cm => cm.Default("'my default value'"))));
难道这就是你要找的人?
首先使用数据库时,在映射中设置默认值不起作用。 您必须告诉nhibernate使用DataBase默认值。 为此,首先设置数据库中列的默认值。
之后,你告诉NHibernate的映射通过这样做是为了在忽略插入列:
Property(x => x.PropertyName, map =>
{ map.Insert(false);
map.Column("FL_COLUMN");
map.NotNullable(true);
});
我发现这个代码。可以帮助你。
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);
});
未来,如果您能够准确解释您提供的代码的工作方式 - 更多的细节,更好! – Zyerah
我认识到这个代码,它来自别人的博客。 http://notherdev.blogspot.ca/2012/01/mapping-by-code-property.html –