0

When a user clicks a button next to a certain element on my page I want the elements isAccepted value to change. When a button is pressed the db.SaveChanges() command throws an exception of type EntityValidationErrors.

Controller

namespace WebApplication6.Controllers
{
    public class AppController : Controller
    {        
         [HttpGet]
         public ActionResult Accept(int? id) 
         {

             EmailFormModel itemToUpdate = db.ProjectInfo.Find(id);

             itemToUpdate.isAccepted = true; //only value I want to change

             db.SaveChanges();


             return RedirectToAction("MainDbView");
        }
    }
}

Model

public class EmailFormModel
{
    public EmailFormModel()
    {
        isAccepted = false;
        Ressurs = new List<RessursBehov>() { new RessursBehov() };
    }

    public int id { get; set; }

    public bool isAccepted { get; set; }

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Prosjektnummer"), RegularExpression(@"^([pP])\d*$", ErrorMessage = "Prosjektnummer er på formen: p1234 ")] 
    public string Prosjektnummer { get; set; }

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Prosjektnavn")]
    public string Prosjektnavn { get; set; }

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Prosjekttype")]
    public string Prosjekttype { get; set; }

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Prosjektleder")]
    public string Prosjektleder { get; set; }

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Skjema utfylt av")]
    public string Prosjektregistrerer { get; set; }

    [Required]
    public virtual List<RessursBehov> Ressurs { get; set; }

}
public class RessursBehov
{
    public int id { get; set; }    

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Ressurstype")]
    public string Ressurstype { get; set; }

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Navn på ressurs")]
    public string Navn_På_Ressurs { get; set; }

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Ukenummer"), RegularExpression(@"^([1-9]|[1-4][0-9]|5[0-2])$", ErrorMessage = "Ugyldig verdi")]
    public int? Ukenummer { get; set; }

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Antall timer"), RegularExpression(@"^([1-9]|[1-9][0-9])$", ErrorMessage = "Ugyldig verdi")]
    public int? Antall_Timer { get; set; }

    [Required(ErrorMessage = "påkrevet"), Display(Name = "Antall uker"), RegularExpression(@"^([1-9]|[1-9][0-9])$", ErrorMessage = "Ugyldig verdi")]
    public int? Antall_Uker { get; set; }

    [Required]
    public virtual EmailFormModel realemailformmodel { get; set; }
}

Context class

public class TalkToDb : DbContext
{
   public DbSet<EmailFormModel> ProjectInfo { get; set; }

    public DbSet<RessursBehov> ProjectExtra { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //one-to-many 
        modelBuilder.Entity<RessursBehov>()
                    .HasRequired<EmailFormModel>(s => s.realemailformmodel)
                    .WithMany(s => s.Ressurs);
    }
}

UPDATE

This is the error i get:

Exception thrown: 'System.Data.Entity.Validation.DbEntityValidationException' in EntityFramework.dll iisexpress.exe Information: 0 : Property: Ressurstype Error: påkrevet

iisexpress.exe Information: 0 : Property: Navn_På_Ressurs Error: påkrevet

iisexpress.exe Information: 0 : Property: Ukenummer Error: påkrevet

iisexpress.exe Information: 0 : Property: Antall_Timer Error: påkrevet

iisexpress.exe Information: 0 : Property: Antall_Uker Error: påkrevet

HerSta
  • 107
  • 9

1 Answers1

0

That exception means that your entity failed validation. If you debug, you can inspect the ModelState object and look for items with a non-empty Errors property.

Alternatively, you can rewrite the exception to be a little more descriptive:

try
{
    db.SaveChanges();
}
catch (DbEntityValidationException e)
{
    var errorMessages = e.EntityValidationErrors
        .SelectMany(x => x.ValidationErrors)
        .Select(x => x.ErrorMessage);

    var fullErrorMessage = string.Join("; ", errorMessages);
    var exceptionMessage = string.Concat(e.Message, " The validation errors are: ", fullErrorMessage);
    throw new DbEntityValidationException(exceptionMessage, e.EntityValidationErrors);
}

That will actually list out each validation error as part of the exception message, making it a lot easier to tell what you need to fix. If you're using a repository or service you can actually build this into your "Save" method, so it happens automatically, without having to use a try block every time you want to save an entity.

Chris Pratt
  • 232,153
  • 36
  • 385
  • 444