C# 一个或多个实体的验证失败-SaveChanges EF4

C# 一个或多个实体的验证失败-SaveChanges EF4,c#,asp.net-mvc-3,entity-framework-4,C#,Asp.net Mvc 3,Entity Framework 4,我正在尝试编写一个生成多张发票的方法。这是针对一所大学的,在那里,客户与导师一起注册一个名为“注册”的课程。通过这种方法,我试图将导师客户的月费乘以他们的佣金百分比进行累加,因为导师会从他们提供的课程中获得一定的佣金。以下是我的代码: public ActionResult CreateBulkCommissions() { var month = DateTime.Now.ToString("MMMM"); var enrolments = db.Enrollments.To

我正在尝试编写一个生成多张发票的方法。这是针对一所大学的,在那里,客户与导师一起注册一个名为“注册”的课程。通过这种方法,我试图将导师客户的月费乘以他们的佣金百分比进行累加,因为导师会从他们提供的课程中获得一定的佣金。以下是我的代码:

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");
}
public ActionResult())
{
var month=DateTime.Now.ToString(“MMMM”);
var enrolments=db.enrolments.ToList();
var=从入学人数算起
选择新的TutorCommission()
{
佣金金额=注册人数。月费,
CommissionMonth=month,//字符串常量
佣金状态=“未付”,
导师=新导师{TutorNoID=incluation.Tutor.TutorNoID,TutorCommissionPercentage=incluation.Tutor.TutorCommissionPercentage}
};
foreach(新来任务中的新来任务)
{
列出tutorcom=newCommissions.GroupBy(g=>g.Tutor)。选择(s=>newtutorcommission
{
佣金金额=s.Sum(u=>u.CommissionMount)*s.Key.TutorCommissionPercentage,
TutorNoID=s.Key.TutorNoID
}).ToList();
db.TutorCommission.Add(新任务);
db.SaveChanges();
}
返回操作(“索引”);
}
在SaveChanges上,我收到一个或多个实体的验证失败的错误消息。在调试期间查看newCommissions的值时,我注意到在TutorCommission中,CommissionID和TutorNoID为0,这可能是问题所在?我如何解决这个问题?下面是一个截图:

这些是相关的类别:

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

}
公共班级注册
{
[关键]
[显示(Name=“注册ID号”)]
公共长注册IDNumber{get;set;}
[显示(Name=“客户ID号”)]
public long clientnumberrid{get;set;}
[显示(Name=“导师ID号”)]
公共长TutorNoID{get;set;}
[显示(Name=“课程名称”)]
公共字符串CourseName{get;set;}
[显示(Name=“课程时间”)]
公共字符串LessonTime{get;set;}
[显示(Name=“课程日”)]
公共字符串LessonDay{get;set;}
[显示(Name=“课程位置”)]
公共字符串LessonLocation{get;set;}
[显示(Name=“课程类型”)]
公共字符串LessonType{get;set;}
[显示(名称=“课程级别”)]
公共字符串LessonLevel{get;set;}
[显示(Name=“月费”)]
公共长月份fee{get;set;}
公共虚拟客户端{get;set;}
公共虚拟导师{get;set;}
}
公共班级辅导委员会
{
[关键]
[显示(Name=“佣金ID”)]
公共长委托ID{get;set;}
[显示(Name=“佣金月”)]
公共字符串CommissionMonth{get;set;}
[显示(Name=“佣金金额”)]
公共双佣金挂载{get;set;}
[显示(Name=“佣金状态”)]
公共字符串CommissionStatus{get;set;}
[显示(Name=“导师ID号”)]
公共长TutorNoID{get;set;}
公共虚拟导师{get;set;}
公共虚拟ICollection佣金支付{get;set;}
}
公开课导师
{
[关键]
[显示(Name=“导师ID号”)]
公共长TutorNoID{get;set;}
[必需]
[StringLength(50,ErrorMessage=“名字必须少于50个字符”)]
[显示(Name=“First Name”)]
公共字符串TutorFirstName{get;set;}
[StringLength(50,ErrorMessage=“姓氏必须少于50个字符”)]
[显示(Name=“Last Name”)]
公共字符串TutorLastName{get;set;}
[DisplayFormat(DataFormatString=“{0:d}”,ApplyFormatInEditMode=true)]
[显示(Name=“出生日期”)]
公共日期时间?TutorBirthDate{get;set;}
[显示(Name=“手机号码”)]
公共字符串TutorCellphoneNumber{get;set;}
[显示(Name=“家庭号码”)]
公共字符串TutorHomeNumber{get;set;}
[RegularExpression(“^[a-z0-9\\+-]+(\\.[a-z0-9\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\.([a-z]{2,4}$”,ErrorMessage=“不是有效的电子邮件地址”)]
[显示(Name=“电子邮件地址”)]
公共字符串TutorEmailAddress{get;set;}
[显示(Name=“街道地址”)]
公共字符串TutorStreetAddress{get;set;}
[显示(Name=“郊区”)]
公共字符串TutorSuburb{get;set;}
[显示(Name=“City”)]
公共字符串TutorCity{get;set;}
[显示(名称=“邮政编码”)]
公共字符串TutorPostalCode{get;set;}
[显示(Name=“全名”)]
公共字符串全名
{
得到
{
返回TutorFirstName+“”+TutorLastName;
}
}
[显示(Name=“佣金百分比”)]
[必需]
公共双TutorCommissionPercentage{get;set;}
公共虚拟ICollection注册{get;set;}
公共虚拟ICollection TutorCommissions{get;set;}
}
实体验证中的错误:

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

谢谢, 艾米

尝试改变:

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


因为当您尝试将新任务添加到db时,EF会尝试插入新的导师,而不是进行关联。

您是先使用EDMX还是先使用代码?@CodingGorilla EDMX实体不是这样干净的。这绝对是CodeFirst@HasanKhan我就是这么想的;但我只是想确定一下。@Amy你能在“EntityValidationErrors”中发布验证异常中的内容吗?@Amy看起来你的密钥没有被填充;您希望这些是在服务器上创建的标识密钥吗?谢谢,验证错误现在消失了。但问题是,这造成了新的佣金下滑
from enrolment in enrolments
                     select new TutorCommission()
                     {
                         CommissionAmount = enrolment.MonthlyFee,
                         CommissionMonth = month,  // string constant 
                         CommissionStatus = "Unpaid",
                         Tutor = enrolment.Tutor
                     };