我用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尝试创建此表时会导致错误。
如何根据数据库插入默认值?
答案 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论坛帖子,其中包含以下内容作为答案的一部分:
要指定属性/字段的默认值,只需指定它即可 你会是一个正常的领域;在字段定义中或在字段定义中设置它 你的实体的构造函数,没有任何花哨的要求。
遵循此方法将允许使用不同的数据库,而无需担心它们如何生成日期时间默认值。