2013-08-07 1 views
1

Я сопоставляю класс с NHibernate, но я использую одну и ту же карту из двух разных баз данных. Это работает на 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

Я использую 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

Принимая во внимание, что разные базы данных используют разные функции при генерации значений по умолчанию для datetime, я бы принял подход к генерации значений во время инициализации объекта.

Вы можете посмотреть на Default Value does not work with DateTime and Fluent Nhibernate 1.2 ветки форума, который имеет следующее как часть ответа:

Чтобы указать значение по умолчанию для свойства/полей, просто присвоить его как вы нормальное поле ; установить его в определении поля или в конструкторе вашего объекта, ничего не требуется.

После этого подхода позволит работать с различными базами данных, не беспокоясь о том, как они генерируют свои значения по умолчанию для datetime.

 Смежные вопросы

  • Нет связанных вопросов^_^