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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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);
        }