エンティティフレームワークを広範囲に使用するプロジェクトがあります。そして、それはすべて正常に動作します。エンティティフレームワークが既存の関連エンティティを更新しない
ただし、作成しようとしている更新が1つあり、更新もエラーもスローされません。
基本的なプロセスは、既存のエンティティを使用して、新しいエンティティ(異なるタイプ)を作成することです。新しいエンティティはきれいに保存しますが、既存のエンティティは保存しません。
通常、これが発生した場合、エンティティがコンテキストにアタッチされていないことを意味します。しかし、それがあり、私はそれを「追加」するだけでなく、再び付けてみましたが、私は運がなかったのです。
if (fileRowEntity != null)
{
this.Context.FileRowEntities.Attach(fileRowEntity);
fileRowEntity.FileRowStatusId = (int)FileRowStatus.Converted;
fileRowEntity.EdiDocument = ediDocument;
}
ediDocument.InsertedDate = DateTime.Now;
ediDocument.EdiDocumentGuid = Guid.NewGuid();
ediDocument.DocumentMetatdata = null;
this.Context.EdiDocuments.Add(ediDocument);
var count = this.Context.SaveChanges();
ediDocument
fileRowEntity
は保存されません。
私はこのことを理解しようとしている私の髪を裂いています。私は明示的な第二のfileRowEntity
を節約しようとしたが、それは戻って保存されたゼロの変更が付属しています:
if (fileRowEntity != null)
{
fileRowEntity.EdiDocumentId = ediDocument.EdiDocumentId;
fileRowEntity.Column100 = "X";
this.Context.FileRowEntities.Attach(fileRowEntity);
count = this.Context.SaveChanges();
}
count
は常にゼロであり、データベースが更新されません。
これをデバッグしようとすると、他に何か分かりません。
エンティティをアタッチしても、変更されたとマークされません。Context.Entry(fileRowEntity).State = EntityState.Modified;を試しましたか? (それを添付する必要はありません。エンティティがデタッチされている場合は、エンティティを添付します)。エンティティがプロキシであるか、あらかじめ読み込まれていない限り、EFはあなたが指示しない限り、変更があったことを認識しないため、更新は行われません。それを明示的に 'Modified'とするとうまくいくはずです。 – Jcl
ありがとうございます。はい、それは確かに保存作業を行います。これは、エンティティが実際に同じコンテキストにないことを意味しますか?私が知る限り、同じエンティティマネージャを使用してエンティティを取得し、エンティティを保存します。 –
エンティティがデータベースからロードされると、元の値(取得されたもの)はコンテキストに格納されます(実際には 'Context.Entry(エンティティ).OriginalValues'でチェックできます)。 (DetectChangesを呼び出すことによって)変更すると、新しい値が格納され(Context.Entry(Entity).CurrentValuesでチェックすることができます)、変更された値があれば、変更を保存するときに 'UPDATE'が生成されます。したがって、元のエンティティが同じコンテキストでデータベースから取得された場合は、変更を検出して変更内容を保存する必要があります。 – Jcl