public async Task <string> UpsertRow( ReminderEntry entry ) { var row = await _db .Reminders .FirstOrDefaultAsync(a => a.ServiceId == _clusterOptions.Value.ServiceId && a.GrainId == entry.GrainRef.ToKeyString() && a.ReminderName == entry.ReminderName ); var nullRow = row == null; if (nullRow) { row = new OrleansEFReminder { Id = Guid.NewGuid(), ETag = entry.ETag, }; _db.Reminders.Add(row); } if (entry.ETag != row.ETag) { throw new OrleansEFReminderException.EtagMismatch( $"etag mismatch. " + $"grainId: {entry.GrainRef.ToKeyString()} " + $"reminderName: {entry.ReminderName}" ); } var serviceId = _clusterOptions .Value .ServiceId; row = OrleansEFMapper .Map(entry, row, serviceId: serviceId); row.ETag = Guid .NewGuid() .ToString(); await _db.SaveChangesAsync(); return(row.ETag); }
/// <summary> /// Maps the specified converter. /// </summary> /// <param name="converter">The converter.</param> /// <param name="src">The source.</param> /// <param name="dst">The DST.</param> /// <returns></returns> internal static ReminderEntry Map( IGrainReferenceConverter converter, OrleansEFReminder src, ReminderEntry dst = null ) { dst = dst ?? new ReminderEntry(); dst.ETag = src.ETag; dst.GrainRef = converter.GetGrainFromKeyString(src.GrainId); dst.Period = TimeSpan.FromMilliseconds(src.Period); dst.ReminderName = src.ReminderName; dst.StartAt = src.StartTime; return(dst); }
/// <summary> /// Maps the specified source. /// </summary> /// <param name="src">The source.</param> /// <param name="dst">The DST.</param> /// <param name="serviceId"></param> /// <returns></returns> internal static OrleansEFReminder Map( ReminderEntry src, OrleansEFReminder dst = null, string serviceId = null ) { dst = dst ?? new OrleansEFReminder(); dst.GrainId = src.GrainRef.ToKeyString(); dst.ETag = src.ETag; dst.GrainHash = (int)src.GrainRef.GetUniformHashCode(); dst.Period = src.Period.TotalMilliseconds; dst.StartTime = src.StartAt; dst.ReminderName = src.ReminderName; dst.ServiceId = serviceId; return(dst); }