0

子エンティティの null 非許容の外部キー列と 1 対多の関係があります。子テーブルからレコードを削除しようとしていますが、機能していないようです。

次のようなメッセージが表示されます - 参照整合性制約違反が発生しました: 関連付けのプリンシパル オブジェクトに設定されていない限り、依存オブジェクトが変更されていない場合、参照整合性制約の一部である主キー プロパティを変更できません。プリンシパル オブジェクトを追跡し、削除のマークを付けないようにする必要があります

context.Set().Remove(entity)... を呼び出すだけでオブジェクトを削除しようとしています...

親コレクションからエンティティを削除してから、変更の保存を呼び出す前に削除しようとしました。また、子エンティティを直接削除しようとしましたが、何をしても機能しないようです。

エンティティフレームワーク5でnull不可の外部キー関係を持つ子エンティティを削除する適切な方法は何ですか?

ここに私のマッピング設定があります:

エンティティ マッピング

これは動作します -

var item = this.unitOfWork.PersonalListItemRepository.GetFirst(x => x.PersonalListID == 45146 && x.ItemCode == "1030943" && x.UOM == "EA");
        this.unitOfWork.PersonalListItemRepository.Delete(item);

削除の実装は単純です-

this.context.Set<T>().Remove(item);

ただし、これは機能しません-

var listToUpdate =
this.unitOfWork.PersonalListRepository.FindByExpression(
    x => x.PersonalListID == personalList.PersonalListID).First();
var entityToDelete = listToUpdate.PersonalListItems.First();

this.unitOfWork.PersonalListItemRepository.Delete(entityToDelete);

FindByExpressionの実装 --

 public ICollection<T> FindByExpression(Expression<Func<T, bool>> expression)
    {
        return context.Set<T>().Where(expression).ToList();
    }

また、親エンティティ コレクションからアイテムを削除して、親を更新しようとしました。削除する必要がある子のリストを取得したら、コンテキストからそれらをリロードしてから削除できると思います(ただし、アイテムが最初からコンテキストからロードされているため、これは不要のようです)。私はここで何か大きなものを見逃しているに違いない...

4

1 に答える 1

1

さて、ここでの問題は、最終的に削除 (またはコンテキストへの変更/添付) しようとしたアイテムが、元のクエリからデータベースにプルされたプロキシではないということでした。そのため、エンティティ フレームワークは、エンティティの主キーを変更しようとしていたにもかかわらず、新しいエンティティ値で既に追跡していたため、不平を言っていました (例外は正しいものの、誤解を招くものでした)。

ここでの解決策は、コンテキストが同じエンティティのプロキシ バージョンの追跡を既に開始している場合に、非プロキシ エンティティをアタッチまたは更新しようとしていないことを確認することです。

于 2013-08-06T13:35:07.657 に答える