1

ここSOには多くのエラーがありますが、このシナリオは違うと思います。

正常に機能しているコードがあったり、1つのエンティティを更新したりしました。しかし、問題は、AsNoTracking()でキャッシュを無効にすると、キャッシュされていたため、この例外がスローされ始めたことです。

私が行うことは次のとおりです。1。ページでEcoBonusRequestを取得します。2.ユーザーがボタンをクリックすると、現在のステータスプロパティが変更され、ワー​​クフロー履歴のコレクション(ecobonusrequestobjectの関連コレクション)にリストアイテムが追加されます。3. udpateメソッドを呼び出し、状態を変更に設定します。ここでは、例外がスローされました。

これが私のコードです>

EcoBonusRequestRepository.cs

public void UpdateEcoBonusRequest(EcoBonusRequest ecoBonusRequest)
            {
                _context.EcoBonusRequests.Attach(ecoBonusRequest);
                _context.Entry(ecoBonusRequest).State = EntityState.Modified;
            }

EcoBonusRequestBL

public void Update(EcoBonusRequest ecoBonusRequest)
        {
            DALFacade.UpdateEcoBonusRequest(ecoBonusRequest);
        }

EcoBonusRequestページ

public void ChangeStatus(EcoBonusRequest ecoBonusRequest, string stepname, string who, string choosenoption)
        {

            ecoBonusRequest.WorkflowHistories = new List<WorkflowHistory>
                                                   {
                                                       new WorkflowHistory()
                                                           {
                                                               Date = DateTime.Now,
                                                               What = choosenoption,
                                                               StepName = stepname,
                                                               Who = who
                                                           }
                                                   };

            ecoBonusRequest.CurrentStatus = _currentStepBlo.StepName;
            var ecoBonusRequestBL = new EcoBonusRequestBL();
            ecoBonusRequestBL.Update(ecoBonusRequest);
        }

これが私が最初にオブジェクトを取得する方法です:(ここにすべてのレイヤーからすべてのコードを貼り付けるつもりはありません)

protected override void OnInit(EventArgs e)
        {
            var requestBaseId = RequestBaseId;
            if (requestBaseId != null)
            {
                EcoBonusRequest request = GetDBRequest(requestBaseId.Value);

ダルで

public IQueryable<EcoBonusRequest> FindEcoBonusRequests(System.Linq.Expressions.Expression<Func<EcoBonusRequest, bool>> predicate)
            {
                return _context.EcoBonusRequests.AsNoTracking().Where(predicate);
            }
4

1 に答える 1

3

ええ、これは楽しいものです。ここでの問題は、既にコンテキストにアタッチされているエンティティを再アタッチしようとすることにあります。これは、論理エラーが原因である可能性があります。または、添付されたオブジェクトをクリアせずにコンテキストを再利用している可能性があります。データベースには、コンテキストに現在アタッチされているアイテムを確認するために使用できるローカル コレクションがあります。

ctx.YourEntityCollection.Local
于 2012-06-18T11:14:35.987 に答える