1

私はEntityFrameworkに比較的慣れていません。以下は、一般的なCRUD機能に使用しているコードです。

internal class clsRepository<T>  where T : EntityObject
{

private ObjectContext objCtxt;              
private ObjectSet<T> objSet;

public clsRepository()
{
    objCtxt = new DAL.Entities();
    objSet = objCtxt.CreateObjectSet<T>();            
}

public clsRepository(ObjectContext context)
{
    objCtxt = context;
    objSet = objCtxt.CreateObjectSet<T>();            
}

public T AddEntity(T entity)
{
    objSet.AddObject(entity);
    objCtxt.SaveChanges();
    return entity;
}
public void UpdateEntity(T entity)
{
    object ent;
    if (!objCtxt.TryGetObjectByKey(entity.EntityKey, out ent))
    {
        objSet.Attach(entity);
        objCtxt.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
    }
    else
    {
        objCtxt.ApplyCurrentValues<T>(entity.EntityKey.EntitySetName, entity);
    }            
    objCtxt.SaveChanges();
}
public void DeleteEntity(T entity)
{
    object ent;
    if (!objCtxt.TryGetObjectByKey(entity.EntityKey, out ent))
    {
        objSet.Attach(entity);
        objCtxt.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Deleted);   
    }                      
    objSet.DeleteObject(entity);
    objCtxt.SaveChanges();            
}        
}

1)これはエンティティモデルを操作する効率的な方法ですか?

2)objCtxt.CreateObjectSet<T>():このコード行は、データベース内のすべてのエンティティをオブジェクトコンテキストにロードすると想定していますが、これによりパフォーマンスの問題が発生しますか?

誰かがより良い方法を提案できますか?ありがとうございました。

4

1 に答える 1

2

最初に2番目の質問。objCtxt.CreateObjectSet<T>();データベースからすべてのエンティティをロードするのではなく、を作成するだけObjectSetです。これは、IQueryableクエリを開始したときにエンティティをロードするためです。

さて、最初の質問です。汎用リポジトリを使用することを決定したら、これはそれを行う方法です。いくつかの意見:

  • entity.EntityKeynullにすることができます。だからあなたもそれをチェックしなければなりません。
  • が作成されるパラメーターなしのコンストラクターがありますObjectContext。複数のリポジトリを含むジョブでは、1つのコンテキストインスタンスが必要であり、リポジトリを共有コンテキストと混合したくないので、私は常にリポジトリの外部にコンテキストを作成します(またはIoCコンテナを介して注入します)。独自のコンテキスト。
  • SaveChanges()これは、呼び出しを削除する方がよいことも意味します。パターンは次のようになります。

    using (var ctx = new DAL.Entities();
    {
         var repo1 = new clsRepository<A>(ctx);
         .... 
         var repo2 = new clsRepository<B>(ctx);
         .... 
         if (// no error )
             ctx.SaveChanges();
    }
    

「一般的なリポジトリを使うことに決めたら」と言ったのには理由があります。これはよく引用される投稿であり、間違いなくあなたに考え直しを与えるでしょう。

リポジトリメソッドは、拡張メソッドでもある可能性がありObjectSetます。まったく同じことを行いますが、これらすべてのリポジトリを常に作成しなくても、コンテキストを操作するだけです。

于 2013-03-20T16:09:00.060 に答える