0

これは、EFを使用してSQLサーバーに新しいエンティティを追加する簡単なコードです

   var isNewEntity = entity.Id == 0;

        if (isNewEntity)
        {
            _unitOfWork.Context.DbTripReportDefinitionSectionSet.Add(entity);
        }
        else
        {
            ObjectStateEntry stateEntry;
            _unitOfWork.ObjectStateManager.TryGetObjectStateEntry(entity, out stateEntry);

            if (stateEntry == null)
            {
                _unitOfWork.Context.DbTripReportDefinitionSectionSet.Attach(entity);
            }

            _unitOfWork.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
        }

        _unitOfWork.Save();

        return entity.Id;

問題は私に例外があることです

'同じキーを持つオブジェクトが既に ObjectStateManager に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。既に存在しますが、追跡対象のエンティティではありません。

したがって_unitOfWork.ObjectStateManager.TryGetObjectStateEntry(entity, out stateEntry);、false を返すと、このコード_unitOfWork.Context.DbTripReportDefinitionSectionSet.Attach(entity);は例外をスローします。既に添付されているナビゲーション プロパティのせいだと思います。これらのエンティティをナビゲーション プロパティなしでアタッチするにはどうすればよいですか? または、これらの問題を別の方法で解決するにはどうすればよいですか?

4

1 に答える 1

0

これ以上の情報がない場合は、新しいContextインスタンスを作成することをお勧めします。

おそらく、ナビゲーションプロパティに関するあなたの仮定は正しいでしょう。ただし、コードを修正するのではなくcontext、同じトランザクションでコミットする必要のある操作がない限り、新しいコードを作成することをお勧めします(作業単位パターンを採用していると想定しています)。

于 2013-02-06T12:46:24.467 に答える