0

私は次のモデルを持っています:

public class Job
{
    [Key]
    public int JobID { get; set; }
    public string Status { get; set; }
    public DateTime JobDate { get; set; }
    public string JobTitle { get; set; }
    public int? Cleaner { get; set; }
    public int? Client { get; set; }
    public int EstTime { get; set; }

    public virtual Client ClientInfo { get; set; }
    public virtual Valeter ValeterInfo { get; set; }
}

OnModelCreatingのこれ:

// Relationship Job -> Valeter
        modelBuilder.Entity<Job>()
            .HasOptional<Valeter>(u => u.ValeterInfo)
            .WithMany()
            .HasForeignKey(e => e.Cleaner);

(注:既存のデータベースを使用しています)。次のことを実行しようとすると:

if (ModelState.IsValid)
{
   db.Entry(job).State = EntityState.Modified;
   db.SaveChanges();
}

Cleanerの値を別の値に変更してエラーが発生しない限り、通常は正常に機能します。

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

4

1 に答える 1

2

この例外は通常、およびの場合job.ValeterInfo != null job.ValeterInfo.ValeterId != job.Cleaner発生します。したがって、最も簡単な解決策は、コンテキストにnullアタッチする前にナビゲーションプロパティをに設定することです。job

if (ModelState.IsValid)
{
    job.ValeterInfo = null;
    db.Entry(job).State = EntityState.Modified;
    db.SaveChanges();
}

これは少し奇妙に見え、ハックのようです。しかし、問題は、データをコントローラーアクションに投稿するときになぜそうjob.ValeterInfoではないのかということです。nullの状態を設定するとjobModifiedジョブのスカラープロパティ(を含むCleaner)のみが更新され、のプロパティjob.ValeterInfoや関係は更新されません。job.ValeterInfoしたがって、そもそもプロパティをサーバーに送信する必要はありません。

とにかく、矛盾があります。FKjob.Cleanerは変更されますが、関連するエンティティjob.ValeterInfo(特にその主キープロパティValeterId)は変更されません。EFは、どちらが正しい関係を表しているのかわかりません。外部キープロパティ値またはナビゲーションプロパティ値ですか。このあいまいさにより、例外が発生します。

于 2012-11-14T20:31:09.557 に答える