映射:跨数据库的默认值

时间:2013-08-07 11:32:24

标签: c# hibernate nhibernate nhibernate-mapping

我用NHibernate映射一个类,但我在2个不同的数据库中使用相同的映射。 这适用于Sybase Anywhere,但不适用于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尝试创建此表时会导致错误。

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

2 个答案:

答案 0 :(得分: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);

为我工作。

答案 1 :(得分:0)

请记住,不同的数据库在生成日期时间默认值时使用不同的函数,我会采用在对象初始化时生成值的方法。

您可能希望查看Default Value does not work with DateTime and Fluent Nhibernate 1.2论坛帖子,其中包含以下内容作为答案的一部分:

  

要指定属性/字段的默认值,只需指定它即可   你会是一个正常的领域;在字段定义中或在字段定义中设置它   你的实体的构造函数,没有任何花哨的要求。

遵循此方法将允许使用不同的数据库,而无需担心它们如何生成日期时间默认值。