Validation failed for one or more entities - SaveChanges EF4

10,326

Try to change:

...
from enrolment in enrolments
                     select new TutorCommission()
                     {
                         CommissionAmount = enrolment.MonthlyFee,
                         CommissionMonth = month,  // string constant 
                         CommissionStatus = "Unpaid",
                         Tutor = new Tutor { TutorNoID = enrolment.Tutor.TutorNoID, TutorCommissionPercentage = enrolment.Tutor.TutorCommissionPercentage }
                     };

To:

from enrolment in enrolments
                     select new TutorCommission()
                     {
                         CommissionAmount = enrolment.MonthlyFee,
                         CommissionMonth = month,  // string constant 
                         CommissionStatus = "Unpaid",
                         Tutor = enrolment.Tutor
                     };

Because when you try to add the new newCommissions to the db EF tries to insert new tutors instead of making the association.

Share:
10,326
Amy
Author by

Amy

Updated on June 04, 2022

Comments

  • Amy
    Amy almost 2 years

    I'm trying to write a method that generates multiple invoices. This is for a college, where clients are enrolled with tutors in a class called Enrollments. With this method, I am trying to accumulate the monthly fee of the tutors clients multiplied by their commission percentages, as tutors earn a certain commission on the lessons they give. Here is my code for this:

    public ActionResult CreateBulkCommissions()
    {
        var month = DateTime.Now.ToString("MMMM");
    
        var enrolments = db.Enrollments.ToList();
    
        var newCommissions = from enrolment in enrolments
                             select new TutorCommission()
                             {
                                 CommissionAmount = enrolment.MonthlyFee,
                                 CommissionMonth = month,  // string constant 
                                 CommissionStatus = "Unpaid",
                                 Tutor = new Tutor { TutorNoID = enrolment.Tutor.TutorNoID, TutorCommissionPercentage = enrolment.Tutor.TutorCommissionPercentage }
                             };
        foreach (var newCommission in newCommissions)
        {
            List<TutorCommission> TutorComs = newCommissions.GroupBy(g => g.Tutor).Select(s => new TutorCommission
            {
                CommissionAmount = s.Sum(u => u.CommissionAmount) * s.Key.TutorCommissionPercentage,
                TutorNoID = s.Key.TutorNoID
    
            }).ToList();
    
            db.TutorCommission.Add(newCommission);
            db.SaveChanges();
        }
    
        return RedirectToAction("Index");
    }
    

    On SaveChanges, I receive the error that validation failed for one or more entities. When I view the values of newCommissions during debug, I notice that in TutorCommission, CommissionID and TutorNoID are 0, which might be the problem? How do I resolve this? Here's a screenshot of that: Debug Error

    These are the relevant classes:

    public class Enrollment
    {
        [Key]
        [Display(Name = "Enrollment ID Number")]
        public long EnrollmentIDNumber { get; set; }
        [Display(Name = "Client ID Number")]
        public long ClientNumberID { get; set; }
        [Display(Name = "Tutor ID Number")]
        public long TutorNoID { get; set; }
        [Display(Name = "Course Name")]
        public string CourseName { get; set; }
        [Display(Name = "Lesson Time")]
        public string LessonTime { get; set; }
        [Display(Name = "Lesson Day")]
        public string LessonDay { get; set; }
        [Display(Name = "Lesson Location")]
        public string LessonLocation { get; set; }
        [Display(Name = "Lesson Type")]
        public string LessonType { get; set; }
        [Display(Name = "Lesson Level")]
        public string LessonLevel { get; set; }
        [Display(Name = "Monthly Fee")]
        public long MonthlyFee { get; set; }
    
        public virtual Client Client { get; set; }
        public virtual Tutor Tutor { get; set; }
    
    }
    
    public class TutorCommission
    {
        [Key]
        [Display(Name = "Commission ID")]
        public long CommissionID { get; set; }
        [Display(Name = "Commission Month")]
        public string CommissionMonth {get; set;}
        [Display(Name = "Commission Amount")]
        public double CommissionAmount { get; set; }
        [Display(Name = "Commission Status")]
        public string CommissionStatus { get; set; }
        [Display(Name = "Tutor ID Number")]
        public long TutorNoID { get; set; }
    
        public virtual Tutor Tutor { get; set; }
        public virtual ICollection<CommissionPayments> CommissionPayments { get; set; }
    
    }
    
    public class Tutor
    {
        [Key]
        [Display(Name = "Tutor ID Number")]
        public long TutorNoID { get; set; }
        [Required]
        [StringLength(50, ErrorMessage="First name must be less than 50 characters")]
        [Display(Name = "First Name")]
        public string TutorFirstName { get; set; }
        [StringLength(50, ErrorMessage = "Last name must be less than 50 characters")]
        [Display(Name = "Last Name")]
        public string TutorLastName { get; set; }
        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        [Display(Name = "Birth Date")]
        public DateTime? TutorBirthDate { get; set; }
        [Display(Name = "Cellphone Number")]
        public string TutorCellphoneNumber { get; set; }
        [Display(Name = "Home Number")]
        public string TutorHomeNumber { get; set; }
        [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$", ErrorMessage = "Not a valid email address")]
        [Display(Name = "Email Address")]
        public string TutorEmailAddress { get; set; }
        [Display(Name = "Street Address")]
        public string TutorStreetAddress { get; set; }
        [Display(Name = "Suburb")]
        public string TutorSuburb { get; set; }
        [Display(Name = "City")]
        public string TutorCity { get; set; }
        [Display(Name = "Postal Code")]
        public string TutorPostalCode { get; set; }
        [Display(Name="Full Name")]
        public string FullName
        {
            get
            {
                return TutorFirstName + " " + TutorLastName;
            }
        }
        [Display(Name="Commission Percentage")]
        [Required]
        public double TutorCommissionPercentage { get; set; }
    
        public virtual ICollection<Enrollment> Enrollments { get; set; }
        public virtual ICollection<TutorCommission> TutorCommissions { get; set; }
    
    }
    

    In EntityValidationErrors:

    Count = 1
    {System.Data.Entity.Validation.DbEntityValidationResult}

    Thanks, Amy

  • Amy
    Amy over 12 years
    Thanks, the validation errors are gone now. But the problem is that it's creating new commission slips per enrollment, where I want to total the enrollments into one commission slip (so one commission slip per tutor for the month). And it's just adding the full monthly fee amount instead of one multiplied by the commission percentage. Can you see why this would be?