2011-11-21 32 views
2

我使用Fluent NHibernate作为我的NHibernate项目的映射机制。但是当涉及到NHibernate 3.2时,我意识到它已经内置了代码映射,并且NHibernate 3.2将不会发布Fluent Nhibernate发行版。如何使用按代码映射为nhibernate 3.2中的表列设置默认值?

当我想为实体属性设置默认值时,我遇到了一个问题,我没有找到API来做到这一点。任何人都可以提供一些建议吗?

回答

6

我还没有使用代码映射,但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'")))); 

难道这就是你要找的人?

0

首先使用数据库时,在映射中设置默认值不起作用。 您必须告诉nhibernate使用DataBase默认值。 为此,首先设置数据库中列的默认值。

之后,你告诉NHibernate的映射通过这样做是为了在忽略插入列:

Property(x => x.PropertyName, map => 
     { map.Insert(false); 
      map.Column("FL_COLUMN");     
      map.NotNullable(true); 
     }); 
5

我发现这个代码。可以帮助你。

 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); 
     }); 
+0

未来,如果您能够准确解释您提供的代码的工作方式 - 更多的细节,更好! – Zyerah

+0

我认识到这个代码,它来自别人的博客。 http://notherdev.blogspot.ca/2012/01/mapping-by-code-property.html –

相关问题