4

すべてのテーブルに CreatedDate、ModifiedDate、VersionNo などのプロパティがいくつかあります。エンティティを変更するたびに、これらのプロパティの値を変更/追加する必要があります。これらのプロパティを使用して基本クラスを作成し、この基本クラスからエンティティを派生させ、ObjectState に基づく SavingChanges 中に値を変更して保存できると考えました。そうすれば、監査エントリがエンティティから分離され、物事が抽象化。しかし、私は Entity Framework に慣れていないので、マッピングなどをどのように処理するかを理解するのが難しいと感じています..

誰かがこれを実装するためのアイデアを提案できれば、それは本当に役に立ちます。リポジトリ コードは次のようになります。

public class GeneralRepository<T> : IRepository<T> where T : class
{
    private ObjectSet<T> _set;
    private ObjectContext _context;


    public GeneralRepository(ObjectContext context)
    {
        if (context == null) throw new ArgumentNullException("context");
        _context = context;                 // sets the context
        _set = context.CreateObjectSet<T>(); // returns the Object Set
    }


    #region Methods to override to work with ObjectGraphs .

    /// <summary>
    /// To insert data from entity into a table.
    /// </summary>
    /// <param name="entity"></param>
    public virtual void Insert(T entity)
    {
        if (entity == null) throw new ArgumentNullException("entity");
        _set.AddObject(entity);
    }


    /// <summary>
    /// To delete entity from a table. 
    /// </summary>
    /// <param name="entity"></param>
    public virtual void Delete(T entity)
    {
        if (entity == null) throw new ArgumentNullException("entity");
        _set.Attach(entity);
        _set.DeleteObject(entity);
    }


    /// <summary>
    /// To update Entity into the table
    /// </summary>
    /// <param name="entity"></param>
    public virtual void Update(T entity)
    {
        if (entity == null) throw new ArgumentNullException("entity");
        _set.Attach(entity);
        _context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
    }

    /// <summary>
    /// To get th entire table contents
    /// </summary>
    /// <returns></returns>
    public IQueryable<T> GetAll()
    {
        return _set;
    }

}

4

3 に答える 3

1

「EntityBase」という名前の基本クラスを作成するか、好みに合った名前を付けて、それらのプロパティを追加します。

次に、上記のリポジトリ クラス宣言コードを次のように変更します。

public class GeneralRepository<T> : IRepository<T> where T : EntityBase

その後、必要に応じてリポジトリ内の共通プロパティを設定できます。

マッピングに関する限り、あなたが最初にデータベースであると述べたように、私は間違いなくEntity Framework 5 Power Toolsを検討しますが、私の経験では常に流暢なAPIを使用してマッピングを行ってきました.

また...現在リポジトリ内で使用しているObjectContextとは対照的に、DBContextが提供する利点のいくつかを間違いなく見てください。

ありがとう

于 2012-11-14T09:10:11.127 に答える
0

BaseEntity のような基本クラスを作成し、そのクラス内に必要なプロパティを含めます。BaseEntity からエンティティを派生させ、次のようにリポジトリを定義します。

public class GeneralRepository<T> : IRepository<T> where T : BaseEntity

マッピングには、階層ごとのテーブル、タイプごとのテーブル、具体的なタイプごとのテーブルの 3 つのバリエーションがあります。それらに関する情報は、Msdn.

ToTable("Apples")ほとんど関連のないエンティティがある場合は、具象型ごとにテーブルを使用し、EntityTypeConfigurationクラス (Fluent API)を呼び出して、エンティティごとに個別のテーブルを作成します。

于 2013-09-04T01:50:59.540 に答える