System.Data.UpdateException;无法添加外键,因为主键的值不存在

时间:2012-03-29 11:59:36

标签: c# asp.net-mvc-3 exception

当我尝试编辑网球场时...我得到了这个例外:System.Data.UpdateException;无法添加外键,因为主键值不存在

TennisCourt模型:

public class TennisCourt
{
    [Key]
    public int ID { get; set; }

    [Display(Name = "Extérieur ?")]
    [Column("Outside")]
    public bool Outside { get; set; }

    [Display(Name = "Disponible ?")]
    [Column("Available")]
    public bool Available { get; set; }

    [Display(Name = "Description")]
    [Column("Description")]
    [MaxLength(90, ErrorMessage = "Description cannot be longer than 90 characters.")]
    public string Description { get; set; }

    [Display(Name = "TennisClubID")]
    public int TennisClubID { get; set; }


    public virtual TennisClub TennisClub { get; set; }
    public virtual ICollection<Reservation> Reservations { get; set; } 
}

“TennisClub模特”

public class TennisClub
{
    public int ID { get; set; }

    [Required(ErrorMessage = "Nom du club requis.")]
    [Display(Name = "Nom")]
    [Column("Name")]
    [MaxLength(40, ErrorMessage = "Name cannot be longer than 40 characters.")]
    public string Name {get;set;}

    [Required(ErrorMessage = "Adresse du club requise.")]
    [Display(Name = "Adresse")]
    [Column("Address")]
    [MaxLength(40, ErrorMessage = "Address cannot be longer than 40 characters.")]
    public string Address {get;set;}

    [Required(ErrorMessage = "Ville requise.")]
    [Display(Name = "Ville")]
    [Column("City")]
    [MaxLength(20, ErrorMessage = "City cannot be longer than 20 characters.")]
    public string City { get; set; }

    [Required(ErrorMessage = "Numéro de téléphone requis.")]
    [Display(Name = "Num. Tél")]
    [Column("PhoneNumber")]
    [MaxLength(20, ErrorMessage = "Phone number cannot be longer than 20 characters.")]
    public string PhoneNumber { get; set; }

    [Display(Name = "Mail")]
    [Column("Mail")]
    [MaxLength(30, ErrorMessage = "Mail cannot be longer than 30 characters.")]
    public string Mail { get; set; }

    [Required(ErrorMessage = "Heure d'ouverture requise.")]
    [Display(Name = "Heure d'ouverture")]
    [Column("OpenTime")]
    [DisplayFormat(DataFormatString = "{0:T}", ApplyFormatInEditMode = true)]
    public DateTime OpenTime { get; set; }

    [Required(ErrorMessage = "Heure de fermeture requise.")]
    [Display(Name = "Heure de fermeture")]
    [Column("CloseTime")]
    [DisplayFormat(DataFormatString = "{0:T}", ApplyFormatInEditMode = true)]
    public DateTime CloseTime { get; set; }

    [Required(ErrorMessage = "Nombre d'heure(s) pour un match en simple requis.")]
    [Display(Name = "Temps de jeu (simple)")]
    [Column("GameTimeSimple")]
    [DisplayFormat(DataFormatString = "{0:T}", ApplyFormatInEditMode = true)]
    public DateTime GameTimeSimple { get; set; }

    [Required(ErrorMessage = "Nombre d'heure(s) pour un match en double requis.")]
    [Display(Name = "Temps de jeu (double)")]
    [Column("GameTimeDouble")]
    [DisplayFormat(DataFormatString = "{0:T}", ApplyFormatInEditMode = true)]
    public DateTime GameTimeDouble { get; set; }

    public virtual ICollection<TennisCourt> TennisCourts { get; set; }
    public virtual ICollection<Teacher> Teachers { get; set; }
    public virtual ICollection<Customer> Customers { get; set; }
    public virtual ICollection<Manager> Managers { get; set; }
    public virtual ICollection<Reservation> Reservations{ get; set; } 
}

错误是在TennisCourt和TennisClub班级之间使用外键......

奇怪的是,当我创建一个网球场时,它的确有效!

例外:

   [HttpPost]
    public ActionResult Edit(TennisCourt tenniscourt)
    {
        if (ModelState.IsValid)
        {
            try
            {
                db.Entry(tenniscourt).State = EntityState.Modified;
                db.SaveChanges();//here the exception
                return RedirectToAction("Index");
            }
            catch (DbUpdateException dbEx)
            {
                System.Diagnostics.Debug.WriteLine(dbEx.InnerException);
            }
        }
        return View(tenniscourt);
    }

我做错了什么?提前谢谢......

1 个答案:

答案 0 :(得分:1)

db.Entry(tenniscourt).State = EntityState.Modified;处设置断点,查看TennisClubID包含的内容。它可能被设置为数据库的网球俱乐部表中不存在的某个值。从你的例子中可以看出原因并不容易。您的GUI中缺少某些引用网球俱乐部的内容?