2

MVC4 を使用して ASP.net Web アプリケーションを開発するのに忙しく、db にいくつかの変更を保存しようとすると、この奇妙なエラーが発生しました。このコードは、コントローラーの 1 つにあります。以下のコードでは、_db.Save() が呼び出されたときに DbEntityValidationException が発生し、次に SaveChanges() が呼び出されます。私はEntityFramework V5で作業しています。

Document document = _db.Documents.SingleOrDefault(x => x.ID == doc.ID);
if (document != null)
{
    document.Location = idPath;
    _db.Save();
}

例外メッセージ:

ここに画像の説明を入力

しかし:次のコードを使用すると、例外は発生せず、パスは正常にデータベースに保存されます。

Document document = _db.Documents.FirstOrDefault(x => x.ID == doc.ID);
if (document != null)
{
    // Needed for SaveChanges to work
    var x = document.Type;

    document.Location = idPath;
    _db.Save();
}

なぜこれが起こるのでしょうか?Documents コレクションのタイプが List である可能性がありますか? エラーの原因が Type プロパティであることがわかりました。

以下は、私の Document クラスの構造です。

[Table("Document")]
public class Document
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int ID { get; set; }

    [Required]
    public virtual string Name { get; set; }
    public virtual string Location { get; set; }
    [Required]
    public virtual DocumentType Type { get; set; }

    [NotMapped]
    public virtual HttpPostedFileBase File{ get; set; }
}
4

2 に答える 2

2

問題は のせいだと思いますLazy Loading

実際、次の行を呼び出すことによって:

Document document = _db.Documents.SingleOrDefault(x => x.ID == doc.ID);

エンティティのスカラー プロパティのみを取得しDocument、そのナビゲーション プロパティは null のままです...! (ブレークポイントを設定して見てください)。

ただし、この行を呼び出すと:

var x = document.Type;

EF にデータベースへのクエリを実行させて、Typeナビゲーション プロパティをメモリにフェッチし、それを dbcontext にアタッチします。確かに、それは正常な動作です。遅延読み込みです! - 本当に必要でない限り、何も取得しないでください。

ですから、ご覧のとおり、もちろん変なエラーではありません! それは遅延読み込みの単なる副作用です...

于 2013-08-12T17:45:12.590 に答える
2

public virtual DocumentType Typeエンティティ定義に従って必要ですが、最初の例でTypeは、熱心な読み込みが有効になっていない場合は null になります (これは私の仮定です)。

2 番目の例が機能する理由Typeは、この行で遅延ロードされているためですvar x = document.Type;。熱心な読み込みをオンにするか、 を使用し.Include()てプロパティを選択的に読み込むことができTypeます。

関連するエンティティを読み込むさまざまな種類の EF に関する情報については、このリンクを確認してください。

http://msdn.microsoft.com/en-us/data/jj574232.aspx

于 2013-08-12T17:25:33.087 に答える