public async Task <IActionResult> Edit(int id, [Bind("CritterLifeEventId,Comment,CritterId,DateTime,Description,EnumCritterLifeEventDataId,EnumCritterLifeEventTypeId,Timestamp,VersionNumber")] CritterLifeEvent val)
        {
            if (val.CritterLifeEventId != id)
            {
                return(NotFound());
            }

            this.FixNullFields(val);

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(val);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!Exists(val.CritterLifeEventId))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            ViewData["CritterId"] = new SelectList(_context.Critter, "CritterId", "CritterImageId", val.CritterId);
            ViewData["EnumCritterLifeEventTypeId"] = new SelectList(_context.EnumCritterLifeEventType, "EnumCritterLifeEventTypeId", "Description", val.EnumCritterLifeEventTypeId);
            return(View(val));
        }
 private void FixNullFields(CritterLifeEvent val)
 {
     if (String.IsNullOrWhiteSpace(val.Comment))
     {
         val.Comment = "N/A";
     }
     if (String.IsNullOrWhiteSpace(val.Description))
     {
         val.Description = "N/A";
     }
 }
        public async Task <IActionResult> Create([Bind("CritterLifeEventId,Comment,CritterId,DateTime,Description,EnumCritterLifeEventDataId,EnumCritterLifeEventTypeId,Timestamp,VersionNumber")] CritterLifeEvent val)
        {
            this.FixNullFields(val);
            if (ModelState.IsValid)
            {
                _context.Add(val);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            ViewData["CritterId"] = new SelectList(_context.Critter, "CritterId", "CritterImageId", val.CritterId);
            ViewData["EnumCritterLifeEventTypeId"] = new SelectList(_context.EnumCritterLifeEventType, "EnumCritterLifeEventTypeId", "Description", val.EnumCritterLifeEventTypeId);
            return(View(val));
        }
        private async Task AddNewEvent(int critterId, int eventId, string eventTypeName, string description)
        {
            var eventType = await this._livestock.EnumCritterLifeEventType.FirstAsync(e => e.Description == eventTypeName);

            if (!eventType.AllowMultiple)
            {
                var critter = await this._livestock.Critter.Include(c => c.CritterLifeEvent).FirstAsync(c => c.CritterId == critterId);

                if (critter.CritterLifeEvent.Any(e => e.EnumCritterLifeEventTypeId == eventType.EnumCritterLifeEventTypeId))
                {
                    throw new OnlyOneEventAllowedException($"Only one '{eventTypeName}' event is allowed per critter.");
                }
            }

            var @event = new CritterLifeEvent
            {
                CritterId   = critterId,
                Comment     = "N/A",
                DateTime    = DateTime.Now,
                Description = description,
                EnumCritterLifeEventDataId = eventId,
                EnumCritterLifeEventType   = eventType,
                VersionNumber = 1
            };

            await this._livestock.AddAsync(@event);

            // TODO: Handle other flags.
            if (eventType.FlagCantReproduce)
            {
                var critter = await this._livestock.Critter.FindAsync(critterId);

                critter.UpdateFlag(CritterFlags.ReproduceNoLifeEvent, true);
            }

            await this._livestock.SaveChangesAsync();
        }