5

DbSet から継承する方法はありますか? 次のように、いくつかの新しいプロパティを追加したいと思います。

public class PersonSet : DbSet<Person>
{
    public int MyProperty { get; set; }
}

しかし、DbContext でインスタンス化する方法がわかりません

public partial MyContext : DbContext
{
    private PersonSet _personSet; 
    public PersonSet PersonSet
    {
        get 
        {
            _personSet = Set<Person>(); // Cast Error here
            _personSet.MyProperty = 10;
            return _personSet;
        }
    }
}

どうすればこれを達成できますか?

4

4 に答える 4

5

1 つの解決策は、IDbSet を実装し、すべての操作を実際の DbSet インスタンスに委譲するクラスを作成して、状態を格納できるようにすることです。

public class PersonSet : IDbSet<Person>
{
    private readonly DbSet<Person> _dbSet;

    public PersonSet(DbSet<Person> dbSet)
    {
        _dbSet = dbSet;
    }

    public int MyProperty { get; set; }

    #region implementation of IDbSet<Person>

    public Person Add(Person entity)
    {
        return _dbSet.Add(entity);
    }

    public Person Remove(Person entity)
    {
        return _dbSet.Remove(entity);
    }

    /* etc */
    #endregion
}

次に、DbContext にカスタム DbSet のゲッターを配置します。

public class MyDbContext: DbContext
{
    public DbSet<Person> People { get; set; }

    private PersonSet _personSet;
    public PersonSet PersonSet
    {
        get 
        {
            if (_personSet == null)
                _personSet = new PersonSet( Set<Person>() );

            _personSet.MyProperty = 10;

            return _personSet;
        }
        set
        {
            _personSet = value;
        }
    }

}
于 2015-04-09T03:32:53.247 に答える
2

私はこれが本当に古いことを知っており、OPはおそらく移動しましたが、私は自分自身で同じことを考えていました. EF は、実行時に MyContext 内に DbSets を設定します。

DbSet<T> から継承する MyDbSet<T> を作成し、DbSet<T> へのすべての参照を MyContext の派生クラスに置き換えました。プログラムを実行しても、どのプロパティもインスタンス化できませんでした。

次に、DbSet<T> がこのインターフェイスを実装しているため、プロパティを IDbSet<T> に設定してみました。これは機能します。

さらに調査すると、DbSet のコンストラクターは保護された内部のものです (保護されたコンストラクターはとにかく内部のコンストラクターを呼び出します)。そのため、MS は独自のバージョンを展開することをかなり難しくしています。リフレクションを介して内部コンストラクターにアクセスできる場合がありますが、とにかく EF が派生クラスを構築しない可能性があります。

機能を DbSet オブジェクトにプラグインする拡張メソッドを作成することをお勧めしますが、状態を保存する場合は行き詰まります。

于 2014-07-30T10:58:00.043 に答える