Имам вече съществуваща база данни, с която се опитвам да използвам автоматичното картографиране на Fluent NHibernate. Много от таблиците имат колони за одит, така че това, което реших, че би било разумно, е много от обектите да наследят прост абстрактен клас като този:
public abstract class AuditableEntity
{
public virtual string CreatedBy { get; set; }
public virtual DateTime CreatedOn { get; set; }
public virtual string ModifiedBy { get; set; }
public virtual DateTime ModifiedOn { get; set; }
}
Проблемът възниква, защото тези стойности са зададени в базата данни и ако се опитам да вмъкна нов обект без да задам тези стойности, получавам SqlTypeException : SqlDateTime overflow
, тъй като като тип стойност, DateTime
се инициализира на DateTime.MinValue
.
Това, което се опитах да направя, за да поправя това, беше да добавя замяна на автоматично картографиране като това:
public class AuditableEntityOverride : IAutoMappingOverride<AuditableEntity>
{
public void Override(AutoMapping<AuditableEntity> mapping)
{
mapping.Map(x => x.CreatedBy).Generated.Insert();
mapping.Map(x => x.CreatedOn).Generated.Insert();
mapping.Map(x => x.ModifiedBy).Generated.Always();
mapping.Map(x => x.ModifiedOn).Generated.Always();
}
}
Това обаче всъщност не прави нищо!
Мога да поправя проблема, като изрично отменя съпоставянето за всеки обект, който наследява колоните за проверка, но това са доста обекти и се опитвам да оставя Fluent NHibernate да свърши по-голямата част от работата тук.
Има ли нещо, което мога да направя, за да наложа това картографиране върху всички подкласове?
Актуализация
В случай, че помогне, ето как създавам фабриката за сесии. Може би има нещо, което пропускам и тук:
var sessionFactory = Fluently.Configure(new Configuration().AddProperties(new Dictionary<string, string>
{
{Environment.ConnectionDriver,typeof (SqlClientDriver).FullName},
{Environment.Dialect,typeof (MsSql2008Dialect).FullName},
{Environment.ConnectionProvider,typeof (DriverConnectionProvider).FullName},
{Environment.ConnectionString, connectionString},
{Environment.ShowSql, "true"},
{Environment.BatchSize, "100"},
{Environment.Isolation,"ReadCommitted"}
}))
.Mappings(map => map.AutoMappings.Add(AutoMap.AssemblyOf<Transaction>(new AutomappingConfiguration())
.Conventions.AddFromAssemblyOf<ReferenceConvention>()
.Conventions.Add(DynamicUpdate.AlwaysTrue())
.Conventions.Add(DynamicInsert.AlwaysTrue())
.UseOverridesFromAssemblyOf<CurrencyOverride>))
.BuildSessionFactory();