/// <summary> /// Starts LiteDB database using a connection string for file system database /// </summary> /// <param name="connectionString">Connection string for LiteDB database</param> /// <param name="prefix">Collections prefix</param> private HangfireDbContext(string connectionString, string prefix = "hangfire") { _prefix = prefix; //UTC - LiteDB BsonMapper.Global.ResolveMember += (type, memberInfo, member) => { if (member.DataType == typeof(DateTime?) || member.DataType == typeof(DateTime)) { member.Deserialize = (v, m) => v != null?v.AsDateTime.ToUniversalTime() : (DateTime?)null; member.Serialize = (o, m) => new BsonValue(((DateTime?)o).HasValue ? ((DateTime?)o).Value.ToUniversalTime() : (DateTime?)null); } }; //UTC - Internal JSON GlobalConfiguration.Configuration .UseSerializerSettings(new JsonSerializerSettings() { DateTimeZoneHandling = DateTimeZoneHandling.Utc, DateFormatHandling = DateFormatHandling.IsoDateFormat, DateFormatString = "yyyy-MM-dd HH:mm:ss.fff" }); Repository = new LiteRepository(connectionString); Database = Repository.Database; ConnectionId = Guid.NewGuid().ToString(); //Create Indexes StateDataKeyValue.EnsureIndex("Key"); StateDataExpiringKeyValue.EnsureIndex("Key"); StateDataHash.EnsureIndex("Key"); StateDataList.EnsureIndex("Key"); StateDataSet.EnsureIndex("Key"); StateDataCounter.EnsureIndex("Key"); StateDataAggregatedCounter.EnsureIndex("Key"); DistributedLock.EnsureIndex("Resource", true); Job.EnsureIndex("Id"); Job.EnsureIndex("StateName"); Job.EnsureIndex("CreatedAt"); Job.EnsureIndex("ExpireAt"); Job.EnsureIndex("FetchedAt"); JobQueue.EnsureIndex("JobId"); JobQueue.EnsureIndex("Queue"); JobQueue.EnsureIndex("FetchedAt"); }