2

私はエンティティを持っています。Mandate. すべての命令には、Person (NavigationProperty) に対する required:many 関係があります。(LazyLoadingEnabled、AutoDetectChangesEnabled、ValidateOnSaveEnabled、ProxyCreationEnabled) で DbContext API を使用します。

ここで、Mandate エンティティを削除したいと思います。委任エンティティは、別のコンテキストによってロードされますAsNoTracking()

message.Result.
    ObserveOn(On<DataComposition>.Scheduler).
    Where(r => r).
    Subscribe(_ =>
    {
        using (var unit = UnitOfWork.Begin())
        {
            var mandate = this.SelectedItem.OriginalEntity;

            this.mandateRepository.Attach(mandate);
            // mandate.Person.ToString();

            this.mandateRepository.Delete(mandate);

            unit.Commit();
        }

        this.List.RemoveOnUi(this.SelectedItem);
    });

コミット中に次の例外が発生します。Entities in 'CodeFirstContainer.Mandates' participate in the 'Mandate_Person' relationship. 0 related 'Mandate_Person_Target' were found. 1 'Mandate_Person_Target' is expected.

作成/選択中に Person プロパティを含めた場合、またはプロパティ (遅延読み込み) にアクセスした場合、削除は機能しますが、削除の場合にのみ多くのエンティティを具体化/保持するのは好きではなく、複数のクエリトリガーするのは好きDELETEではありませんデシベルへ!

4

1 に答える 1

2

ナビゲーションプロパティが設定されている場合mandate.Person、次のSQLステートメント...

delete [dbo].[Mandates]
where (([Id] = @0) and ([PersonId] = @1))

...がデータベースに送信されますが、ナビゲーションプロパティには、親を削除するための正しい人物を実際に入力する必要があると思います。PersonId

EntityFrameworkが主キーを使用してdeleteステートメントを送信しない理由がわかりません...

delete [dbo].[Mandates]
where ([Id] = @0)

...私が予想したように。

編集

エンティティにナビゲーションプロパティMandateの外部キープロパティがある場合、期待されるSQL(上記の2番目)がデータベースに送信されます。この場合、ナビゲーションプロパティは可能であり、FKプロパティの値は重要ではありません。PersonIdPersonPersonnullPersonId

編集2

FKプロパティを導入したくない場合は、DBラウンドトリップコストを最小限に抑えて、その人のIDを取得し、そのキーを使用してダミーの人をメモリに作成することをお勧めします。

// ...
var personId = context.Mandates
    .Where(m => m.Id == mandate.Id)
    .Select(m => m.Person.Id)
    .Single();

mandate.Person = new Person { Id = personId };

this.mandateRepository.Attach(mandate);
this.mandateRepository.Delete(mandate);
// ...
于 2011-10-21T18:07:57.253 に答える