5

レコードを読み取ろうとするときにEFに苦労してから、同じトランザクションでそれらのレコードを削除しました。最初は EntityState.Deleted メソッドを使用していましたが、エラーが発生しました。

操作に失敗しました: 1 つ以上の外部キー プロパティが null 非許容であるため、リレーションシップを変更できませんでした。リレーションシップに変更が加えられると、関連する外部キー プロパティが null 値に設定されます。外部キーが null 値をサポートしていない場合は、新しい関係を定義するか、外部キー プロパティに別の非 null 値を割り当てるか、関連のないオブジェクトを削除する必要があります。

しかし、.Remove() を使用して以下のように変更すると、すべて問題ありません。

  1. .Remove() と .Deleted の違いと最適なタイミングは?
  2. .Deleted メソッドを使用してこれを機能させるにはどうすればよいですか? リポジトリへのコンテキストの新しいインスタンスを作成して読み取り、別のインスタンスを削除しようとしましたが、IEntityTracker に関連するエラーが発生しました。 EF に変換して、それらを認識して削除します。また、最初に読み取りレコードを切り離してみました。すべて役に立たない。

これが問題の方法です。.Deleted メソッドを使用する一般的なリポジトリがあることに注意してください。これは、このシナリオ (同じレコードを読み取ってから削除する) までうまく機能しました。

//Delete Allocation Need and AllocatedContainers for alloc need id
public ActionConfirmation<int> DeleteAllocRecords(int intFacilityId, AllocNeedSourceTypes needSourceType, int intNeedSourceId)
{
var context = new InventoryMgmtContext();
var repository = new AllocationNeedRepository(context);

//Delete Allocation Need and hence children in Allocated Containers
var srcType = needSourceType.ToString();
List<AllocationNeed> allocNeeds = repository.SearchFor(
    x => x.FacilityId == intFacilityId
    && x.NeedSourceType == srcType
    && x.NeedSourceId == intNeedSourceId
).ToList();

//var deleteRepository = new Repository<AllocationNeed>(); <--tried separate instance of context to delete...no worky.

foreach (AllocationNeed allocNeed in allocNeeds)
{
    try
    {
        //NO WORK: context.Entry(allocNeed).State = System.Data.EntityState.Deleted;
        context.AllocationNeeds.Attach(allocNeed); 
        context.AllocationNeeds.Remove(allocNeed); <-- Works
        context.SaveChanges();
    }
    catch (Exception ex)
    {
        return ActionConfirmation<int>.CreateFailureConfirmation(ex.Message, allocNeed.Id);
    }
}
4

2 に答える 2