2011-10-11 69 views
2

我正在尝试编写一个方法来生成多个发票。这是一个大学,在一个名为“注册”的课程中,客户将与导师一起报名。用这种方法,我试图累积导师客户的月费加上他们的佣金百分比,因为导师在他们提供的课程上赚取一定的佣金。这里是我的代码如下:验证失败的一个或多个实体 - SaveChanges EF4

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"); 
} 

的SaveChanges上,我收到验证失败的一个或多个实体的错误。当我在调试期间查看newCommissions的值时,我注意到在TutorCommission中,CommissionID和TutorNoID为0,这可能是问题所在?我该如何解决这个问题?下面是一个屏幕截图:Debug Error

这些都是相关的类:

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; } 

} 

在EntityValidationErrors:

计数= 1
{System.Data.Entity.Validation.DbEntityValidationResult}

谢谢, Amy

+0

您是使用EDMX还是Code-first? – CodingGorilla

+0

@CodingGorilla EDMX实体不是这样干净的。这绝对是CodeFirst –

+0

@HananKhan这就是我所想的;但我只是想确定一下。 – CodingGorilla

回答

3

尝试改变:

... 
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 } 
        }; 

要:

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

因为当你尝试新的newCommissions添加到数据库EF试图插入而不是使联想新教师。

+0

谢谢,现在验证错误消失了。但问题在于,它会为每个注册人创建新的佣金单,我想将注册人数汇总到一张佣金单上(因此每位导师每月有一张佣金单)。它只是增加了每月的全部费用金额,而不是乘以佣金百分比。你能明白为什么会这样吗? – Amy

相关问题