0

私はEFを使用しています。エンティティをキャッシュに保存します。

キャッシュに入れる前に各エンティティをデタッチし、

キャッシュから取得した後、新しい objectContext にアタッチします。

私はusingハイポイントでステートメントを使用しています(私のBLクラスでは、すべてのリクエストに応じて)

しかし、私はこのエラーが発生します:

System.InvalidOperationException: An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
at System.Data.Objects.ObjectContext.VerifyContextForAddOrAttach(IEntityWrapper wrappedEntity)
at System.Data.Objects.ObjectContext.AttachSingleObject(IEntityWrapper wrappedEntity, EntitySet entitySet, String argumentName)
at System.Data.Objects.ObjectContext.AttachTo(String entitySetName, Object entity)
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
at System.Data.Entity.Internal.Linq.InternalSet`1.Attach(Object entity)
at System.Data.Entity.DbSet`1.Attach(TEntity entity)
at Conduit.Mam.ClientService.DAL.MamData.MamDataRepository.GetMamData(String stamp, MaMDBEntities maMDBEntities) in d:\Builds\TFS\9\221\Sources\Server\ClientServices\Dev\ClientService 1.3\ServiceDAL\MamData\MamDataRepository.cs:line 56
at Conduit.Mam.ClientService.BLL.MamDataManager.GetMamData() in d:\Builds\TFS\9\221\Sources\Server\ClientServices\Dev\ClientService 1.3\Conduit.Mam.ClientService.BLL\MamDataManager.cs:line 57
at Conduit.Mam.ClientService.BLL.AppsDataManager.GetClientRelevantsApps(List`1 appsData) in d:\Builds\TFS\9\221\Sources\Server\ClientServices\Dev\ClientService 1.3\Conduit.Mam.ClientService.BLL\AppsDataManager.cs:line 107
at Conduit.Mam.ClientService.Service.Controllers.ClientDataController.GetAppsData() in d:\Builds\TFS\9\221\Sources\Server\ClientServices\Dev\ClientService 1.3\Conduit.Mam.ClientService.Service\Controllers\ClientDataController.cs:line 58   

これが私のデタッチ+アタッチコードです:usingここにobjectContextを注入します:

public static Group GetMamData(string stamp, MaMDBEntities maMDBEntities)
    {
        Group group = MamDataCacheManager.GetMamData(stamp);

        if (group == null)
        {
            //was not found in the cache
            //check for aveilable test with status 'start' - 1
            group = GetGroupsFromDb(stamp, maMDBEntities);

            if (group != null)
            {
                maMDBEntities.Entry(group).State = EntityState.Detached;

                MamDataCacheManager.InsertMamData(stamp, group);

            }
        }

        //option B: attache a new context
        if (maMDBEntities.Entry(group).State == EntityState.Detached)
        {
            maMDBEntities.Groups.Attach(group);
        }

        return group;
    }

初めて (DB からキャッシュに新しいエンティティを取得する):

エンティティは切り離され、同じ contextObjec に接続されます。

2 回目 (キャッシュからエンティティを取得)、

新しい contextObject にのみ添付されます。

追加の手順を実行する必要がありますか? 私のデタッチには何か欠けていますか?

4

1 に答える 1

1

デタッチは、メソッドに渡された特定のオブジェクトにのみ影響します。デタッチされるオブジェクトにオブジェクト コンテキスト内の関連オブジェクトがある場合、それらのオブジェクトはデタッチされません。

于 2013-02-10T10:01:58.857 に答える