5

「方法: 生成されたデータ オブジェクトをカスタマイズする」で説明されているように、EntityFramework オブジェクトの拡張機能を作成していますが、これらの拡張機能の一部では、インスタンスの ObjectContext を取得して、モデル内の他の値を検索する必要があります。Tip 24 – How to get the ObjectContext from an Entity を見つけましたが、これは数年前に書かれたもので、この同様の SO の質問で参照されていますが、より良い答えがあることを本当に望んでいます。

確かにこれは、エンティティ自体からのエンティティのオブジェクト コンテキストの取得を公式の方法でサポートする必要があるほど頻繁に必要とされるものに違いありません。

この実装に関する最新情報をお寄せいただきありがとうございます。

4

3 に答える 3

3

接続されたプロパティを使用する別の解決策があります。

接続されたプロパティの使用は次のようになります(警告:テストされていないコード):

public partial class Database1Entities
{
    private struct ObjectContextProperty { }

    partial void OnContextCreated()
    {
        this.ObjectMaterialized += (_, e) =>
        {
            e.Entity.GetConnectedProperty<Database1Entities, ObjectContextProperty>().Set(this);
        };
        this.ObjectStateManager.ObjectStateManagerChanged += (_, e) =>
        {
            if (e.Action == CollectionChangeAction.Add)
            {
                e.Element.GetConnectedProperty<Database1Entities, ObjectContextProperty>().Set(this);
            }
            else if (e.Action == CollectionChangeAction.Remove)
            {
                e.Element.GetConnectedProperty<Database1Entities, ObjectContextProperty>().Set(null);
            }
        };
    }

    /// <summary>
    /// Gets the object context for the entity. Returns <c>null</c> if the entity is detached.
    /// </summary>
    /// <param name="entity">The entity for which to return the object context.</param>
    public static Database1Entities FromEntity(EntityObject entity)
    {
        return entity.GetConnectedProperty<Database1Entities, ObjectContextProperty>().GetOrConnect(null);
    }
}

次に、を使用Database1Entities.FromEntityして、エンティティオブジェクトからオブジェクトコンテキストを取得できます。必要に応じて、エンティティオブジェクトに実際のプロパティを定義することもできます。

public partial class Table1
{
    /// <summary> 
    /// Gets the object context for this entity. Returns <c>null</c> if the entity is detached.
    /// </summary> 
    public Database1Entities ObjectContext { get { return Database1Entities.FromEntity(this); } }
}

このソリューションではObjectContext、エンティティオブジェクトのプロパティはオプションです。

于 2011-04-22T16:07:17.863 に答える
0

いいえ、そのような方法はありません。EntityObjectエンティティは次のように定義されている派生元であるため、説明されている回避策が唯一のオプションのように見えます。

[Serializable, DataContract(IsReference=true)]
public abstract class EntityObject : StructuralObject, IEntityWithKey,  
    IEntityWithChangeTracker, IEntityWithRelationships
{
    ...
}

私が知っているように、にIEntityWithRelationships.RelationshipManagerつながるだけObjectContextです。これは EF 4 では変更されていません。

また、エンティティからコンテキストにアクセスすることはあまり一般的ではありません。これは、EF の上にアクティブ レコード パターンを実装する場合に役立つと想像できますが、そのような場合、おそらくエンティティの静的メソッド内でコンテキストを作成することも制御できるため、それを実在物。それ以外の場合は、できるだけ避けるべきものだと思います。

于 2011-04-18T19:38:34.230 に答える
0

これは私が使用するものです。これは、プロジェクトに簡単に追加できる規則ベースのアプローチです。

まず、オブジェクト コンテキストにフックを追加します。

public partial class Database1Entities
{
    partial void OnContextCreated()
    {
        this.ObjectMaterialized += (_, e) =>
        {
            try
            {
                dynamic entity = e.Entity;
                entity.ObjectContext = this;
            }
            catch (RuntimeBinderException)
            {
            }
        };
        this.ObjectStateManager.ObjectStateManagerChanged += (_, e) =>
        {
            if (e.Action == CollectionChangeAction.Add)
            {
                try
                {
                    dynamic entity = e.Element;
                    entity.ObjectContext = this;
                }
                catch (RuntimeBinderException)
                {
                }
            }
            else if (e.Action == CollectionChangeAction.Remove)
            {
                try
                {
                    dynamic entity = e.Element;
                    entity.ObjectContext = null;
                }
                catch (RuntimeBinderException)
                {
                }
            }
        };
    }
}

ObjectContextこれは、オブジェクト コンテキストに関連付けられているエンティティで呼び出されるプロパティを動的に設定しようとします。

ObjectContext次に、エンティティ タイプに を追加します。

public partial class Table1
{
    /// <summary> 
    /// Gets or sets the context for this entity.
    /// This should not be set by end-user code; this property will be set
    /// automatically as entities are created or added,
    /// and will be set to <c>null</c> as entities are detached.
    /// </summary> 
    public Database1Entities ObjectContext { get; set; }
}

ObjectContextこのソリューションでは、各エンティティ タイプにプロパティを追加する必要があります。

于 2011-04-22T16:05:35.023 に答える