63

ObjectContext の場合のように、DbContext オブジェクトに Detach メソッドがないのはなぜだろうか。この省略は意図的なものだとしか思えませんが、その理由を理解するのに苦労しています。エンティティをデタッチして再アタッチできるようにする必要があります (たとえば、ASP.NET プロジェクトのキャッシュに入れるため)。ただし、エンティティをデタッチできないため、以前のコンテキストに関連付けられていたエンティティをアタッチしようとすると、「IEntityChangeTracker の複数のインスタンスでエンティティ オブジェクトを参照できません」という例外が発生します。

ここでのガイダンスは何ですか?何か不足していますか?

4

4 に答える 4

85

この質問に出くわす可能性のある人のために、CTP5 の時点で、次のように書く必要があります。

((IObjectContextAdapter)context).ObjectContext

ObjectContext に到達するため。

于 2010-12-08T10:09:36.457 に答える
37

DbContext は ObjectContext を内部で使用し、EF チームはこれを保護されたプロパティとして利用できるようにします。これは、下位レベルの API にドロップダウンする必要があり、ここではそのように聞こえる場合に備えて、派生から必要な機能を使用または公開できるようにするためです。 Dbコンテキスト:

public class YourContext : DbContext 
{
    public void Detach(object entity) 
    {
        ObjectContext.Detach(entity);            
    }
}

次に、コントローラーからこのメソッドを呼び出して、エンティティをデタッチできます。

または、よりリッチな API を持つように変更することもできます。

public class YourContext : DbContext
{
    public void ChangeObjectState(object entity, EntityState entityState)
    {
        ObjectContext.ObjectStateManager.ChangeObjectState(entity, entityState);
    }
}

メタデータから DbContext がどのように見えるかを次に示します。

public class DbContext : IDisposable 
{      
    protected System.Data.Objects.ObjectContext ObjectContext { get; }
    ...
}
于 2010-11-12T19:36:59.357 に答える
16

EF:CF 4.1 RC1EF:CF 4.1 RTWには、明示的に実装された同じ IObjectContextAdapter があります。

public static class DbContextExtensions
{
    public static void Detach(this System.Data.Entity.DbContext context, object entity)
    {
         ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext.Detach(entity);
    }
}

Microsoftは「デタッチは高度すぎる技術であり、隠すべきだ」と判断。これを発明した人は撃たれるべきです-新しいエンティティを追加した場合、データベースに変更をコミットせずにエンティティを削除するのは難しいためです(DbEntityEntryで操作できますが、それは別の話です)。

4年後に編集:

EF6では(どういうわけか EF5 をスキップしました :))新たに追加されたエントリを削除しても EF4 のようにdetach()生成されないため、もう必要ありません。呼び出すだけですべて問題ありません。delete from [table] where [Id] = 0mySet.Remove(myFreshlyCreatedAndAddedEntity)

于 2011-05-31T11:54:23.863 に答える