2013-08-07 185 views
1

我映射与NHibernate一类,但我用超过2个不同的数据库相同的地图的默认值。 这部作品的Sybase任何地方,但在SQLite不工作。映射:跨数据库

这是我的地图类:

public FooMap() 
{ 
    Property(x => x.Date, map => 
    { 
     map.Column(c => c.Default("now(*)")); 
     map.Generated(PropertyGeneration.Insert); 
     map.NotNullable(true); 
    }); 
} 

,这是映射:

public class Provider 
{ 
    public void AddMappings(ModelMapper mapper) 
    { 
     mapper.AddMappings(Assembly.GetAssembly(typeof(BaseMap)).GetExportedTypes().Where(x => x.Name.EndsWith("Map"))); 
    } 
} 

SQLite没有NOW函数,所以这会导致错误当Hibernate试图创建该表。

如何与数据库根据我插入的默认值?

回答

0

我使用StructureMapMVC所以我这样做:

var db = DependencyResolver.Current.GetService<Provider>(); 

if (db == null) 
{ 
    throw new NullReferenceException("Service Provider not found."); 
} 

if (db is SybaseProvider) 
{ 
    map.Column(c => c.Default("now(*)")); 
} 
else // SQLite 
{ 
    map.Column(c => c.Default("CURRENT_TIMESTAMP")); 
} 
map.Generated(PropertyGeneration.Insert); 
map.NotNullable(true); 

为我工作。

0

记住,不同的数据库中生成日期时间的默认值使用不同功能的轴承,我会采取在对象初始化时产生的值的方法。

您不妨看看Default Value does not work with DateTime and Fluent Nhibernate 1.2论坛主题它具有以下为部分答案:

要指定属性/字段的默认值,只是为它分配一样 你将一个正常的场;设置字段定义或 构造你的实体,需要没有任何幻想。

按照这一办法将允许具有不同的数据库工作,而不必担心他们是如何生成的日期时间的默认值。