1

ここに見られるように、私は非常に単純なモデルを持っています:

public class Cases
    {
    //case data model for call center
    //implement lists for all related child tables too

    [Key]
    public int CasesID { get; set; }

    public string CaseNumber { get; set; }

    [Required(ErrorMessage = "Customer is Required")]
    public int CustomerID { get; set; }
    public Customer Customer { get; set; }

    [MaxLength(50)]
    public string UserName { get; set; }  //get user name from the aspnet membership

    [Required(ErrorMessage = "Case Category is Required")]
    public int CaseCategoryID { get; set; }

    [Required(ErrorMessage = "Technician is Required")]
    public int TechnicianID { get; set; }
    public Technician Technicians { get; set; }

    [Required(ErrorMessage = "Engine Model is Required")]
    public int EngineModelID { get; set; }
    public EngineModel EngineModel { get; set; }

    [MaxLength(50)]
    public string BMSWorkorder { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Status is Required")]
    public string CaseStatus { get; set; }

    [MaxLength(50)]
    public string OpenedBy { get; set; }

    [Required(ErrorMessage = "Opened Date is Required")]
    [DataType(DataType.DateTime)]
    public DateTime? OpenedDate { get; set; }

    [MaxLength(50)]
    public string ClosedBy { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? ClosedDate { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage="Caller First Name is Required")]
    public string CallerFirstName { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Caller Last Name is Required")]
    public string CallerLastName { get; set; }

    [MaxLength(10)]
    [Required(ErrorMessage = "Qualified is Required")]
    public string Qualified { get; set; }

    public string Description { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "ESN is Required")]
    public string ESN { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "Mileage is Required")]
    public string Mileage { get; set; }

    [DataType(DataType.Date)]
    public DateTime? DateInService { get; set; }

    [MaxLength(50)]
    public string ESTR { get; set; }

    [MaxLength(50)]
    [Required(ErrorMessage = "EDS is Required")]
    public string EDS { get; set; }

    [MaxLength(50)]
    public string GensetSerialNumber { get; set; }

    [MaxLength(50)]
    public string GensetModelNumber { get; set; }

    //child Case Notes records
    public virtual ICollection<CaseNotes> CaseNotes { get; set; }

    //child case attachment records
    public virtual ICollection<Attachment> Attachments { get; set; }

    //child case complaint records
    public virtual ICollection<CaseComplaint> CaseComplaint { get; set; }

    //tracking fields
    public DateTime? CreatedOn { get; set; }
    [MaxLength(50)]
    public string CreatedBy { get; set; }
    public DateTime? ModifiedOn { get; set; }
    [MaxLength(50)]
    public string ModifiedBy { get; set; }
    }

Case には、多数の CaseNotes、Attachments、および CaseComplaints を含めることができます。外部キーは、Technicians、Customers、および EngineModel です。

今日まで、このモデルの追加と編集はすべて順調でした。ここで、編集ビューでケース レコードを更新しようとしたときにのみ、 「参照整合性制約違反が発生しました: 参照制約を定義するプロパティ値が、関係のプリンシパル オブジェクトと依存オブジェクトの間で一貫性がありません。 」というメッセージが表示されます。すべての必須フィールドが入力されているため、作成と挿入は問題ありません。なぜこれが起こり始めるのでしょうか。参考までに、context.SaveChanges を呼び出すためだけにモデルを調べると、すべてのデータが正しく表示され、FK 値が入力されていることがわかりますが、外部キー クラス (Technicians) のナビゲーション プロパティのデータはほとんどそのように見えますこれらのクラスに新しいレコードを挿入しようとしていると思います...

ここに私のコントローラの編集アクションがあります:

public ActionResult Edit(int id)
    {
        Cases cases = db.Cases.Find(id);
        db.Entry(cases).Reference(x => x.Customer).Load();
        db.Entry(cases).Collection(x => x.CaseComplaint).Load();
        db.Entry(cases).Collection(x => x.CaseNotes).Load();
        db.Entry(cases).Reference(x => x.Technicians).Load();

        GetCaseCategoryLookup(cases.CaseCategoryID);
        GetEngineModelLookup(cases.EngineModelID);
        GetTechnicianLookup(cases.TechnicianID);
        GetQualifiedList(cases.Qualified);
        GetCaseStatusList(cases.CaseStatus);

        return View(cases);
    }

    //
    // POST: /Cases/Edit/5

    [HttpPost]
    public ActionResult Edit(Cases cases)
    {
        if (ModelState.IsValid)
        {
        AppHelpers help = new AppHelpers();

            if (cases.CaseStatus == "CLOSED")
                {
                cases.ClosedBy = "USER";
                cases.ClosedDate = help.GetEasternTime();
                }
            cases.ModifiedBy = "USER";
            cases.ModifiedOn = help.GetEasternTime();

            db.Entry(cases).State = EntityState.Modified;
            db.SaveChanges();

        }

        return RedirectToAction("Index");
    }
4

1 に答える 1

2

例外の意味を説明するだけです:

参照整合性制約違反が発生しました: 参照制約を定義するプロパティ値が、リレーションシップ内のプリンシパル オブジェクトと従属オブジェクトの間で一貫していません。

コントローラー ポスト アクションのプリンシパル オブジェクトはcases.Technicians、従属オブジェクトは ですcases。「参照制約を定義するプロパティ値」は、依存オブジェクトの外部キー、つまり でありcases.TechnicianID、反対側ではプリンシパルの主キー、つまり ですcases.Technicians.TechnicianID

例外は、これらの 2 つの値が異なることを示していますがcases.TechnicianID != cases.Technicians.TechnicianID、エンティティを更新するときは同じでなければなりません。

あなたの見解が正確に何をすべきかわかりません。casesエンティティまたはcases.Techniciansプロパティのみを編集できますか? それとも、新しい既存の技術者のみを に割り当てることができますcasesか? 後者の場合、モデル バインダーがインスタンスを作成する理由がわかりcases.Techniciansませんcases.Technicianscases.TechnicianID別の既存の技術者を割り当てるには、外部キーをフォーム フィールドにバインドするだけで十分です。

いずれにせよ、とが同じ値cases.TechnicianIDを持っているか、 であることを確認する必要があります。それは、ビューが何をすべきか、および更新する必要があるデータに依存します-プロパティのみまたはプロパティも同様です。cases.Technicians.TechnicianIDcases.Techniciansnullcasescases.Technicians

于 2012-07-12T11:32:08.060 に答える