1

我正在使用 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 尝试创建此表时会导致错误。

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

4

2 回答 2

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);

为我工作。

于 2013-08-07T11:56:31.690 回答
0

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

您可能希望查看Default Value does not work with DateTime and Fluent Nhibernate 1.2 forum thread,其中包含以下答案:

要为属性/字段指定默认值,只需像分配普通字段一样分配它;在字段定义或实体的构造函数中设置它,不需要任何花哨的东西。

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

于 2013-08-08T05:33:46.190 回答