MeterPeak エンティティがあり、このエンティティには外部キーとして MeterReading エンティティがあります (質問の下部に含まれています)。MeterReading エンティティには、MeterSiteId と DateTime で構成される複合主キーがあります。
したがって、MeterPeak エンティティでは、既存の MeterReading エンティティと一致する MeterSiteId と DateTime を入力して、外部キー制約を満たす必要があることを理解しています。存在しない外部キーへのリンクは許可されるべきではありません。
ただし、MeterPeakController の編集アクションには、次のコードがあります。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(MeterPeak meterpeak)
{
if (ModelState.IsValid)
{
unitOfWork.MeterPeakRepository.Update(meterpeak);
unitOfWork.Save();
return RedirectToAction("Index");
}
ViewBag.MeterSiteId = new SelectList(unitOfWork.MeterSiteRepository.Get(b => true), "Id", "Location", meterpeak.MeterSiteId);
return View(meterpeak);
}
既存の検針値と一致しない MeterSiteId と DateTime を入力して保存しようとすると、ModelState.IsValid チェックが false を返すことを期待しますが、そうではありません。unitOfWork.save() 行に到達したときにのみ失敗し、このエラーで dbcontext への変更を保存するときにエラーが発生します
The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_dbo.MeterPeaks_dbo.MeterReadings_MeterSiteId_DateTime"
dbcontext.save に到達する前に ModelState.IsValid がこの問題を検出しないのはなぜですか?
public class MeterPeak
{
[Key]
public int Id { get; set; }
[ForeignKey("PeakReading"), Column(Order = 1)]
public int MeterSiteId { get; set; }
[ForeignKey("PeakReading"), Column(Order = 2)]
public DateTime DateTime { get; set; }
public int? Rating { get; set; }
public String Note { get; set; }
public virtual MeterReading PeakReading { get; set; }
}
public class MeterReading
{
[Key, Column(Order = 1)]
[Required(ErrorMessage = "Please Select a Meter Site")]
public int MeterSiteId { get; set; }
[Key, Column(Order = 2)]
[Required]
public DateTime DateTime { get; set; }
//This is not the Primary key but I need one unique value to assist in getting records, especially from Javascript
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid SingleKey { get; set; }
public virtual MeterSite MeterSite { get; set; }
[Required]
[DisplayFormat(DataFormatString = "{0:#,##0.00000#}", ApplyFormatInEditMode = true)]
public Double RawLevel { get; set; }
[Required]
[DisplayFormat(DataFormatString = "{0:#,##0.00000#}", ApplyFormatInEditMode = true)]
public Double RawVelocity { get; set; }
[Required]
[DisplayFormat(DataFormatString = "{0:#,##0.00000#}", ApplyFormatInEditMode = true)]
public Double RawFlow { get; set; }
[DisplayFormat(DataFormatString = "{0:#,##0.00000#}", ApplyFormatInEditMode = true)]
public Double ValidLevel { get; set; }
[DisplayFormat(DataFormatString = "{0:#,##0.00000#}", ApplyFormatInEditMode = true)]
public Double ValidVelocity { get; set; }
[DisplayFormat(DataFormatString = "{0:#,##0.00000#}", ApplyFormatInEditMode = true)]
public Double ValidFlow { get; set; }
[Range(-1, 3, ErrorMessage = "Rating must be one of the following -1,0,1,2,3")]
public int Rating { get; set; }
public bool? Valid { get; set; }
public virtual ICollection<Note> Notes { get; set; }
}