2012-01-28 15 views
1

私は.NET C#開発をかなり新しくしています。最近、ほとんどのデータアクセスレイヤでLINQ to SQLを使用し始めました。残念ながら、私はDataContextを管理する方法に苦労しているので、エンティティがコンテキストにアタッチされていないか、別のコンテキストにエンティティをアタッチしようとしたときに恐ろしい例外が発生することはありません。多くの読書の後、私は自分のアプリケーションの最善の解決策は、私のアプリケーションの期間中、DataContextを開いたままにすることだと考えています。リポジトリパターンを使用したときのLinq To SQLの1つ

つまり、自分のコンテキストで管理されているすべてのエンティティに対して、基本的なCRUD操作(作成、読み取り、更新、および破棄)を実装するためにリポジトリパターンを使用しています。私のリポジトリの実装は以下に含まれています。リポジトリに加えて、より具体的なデータアクセスメソッド(CustomerDAO.getCustomerByName(文字列名)など)を持つ各エンティティのDAO(データアクセスオブジェクト)があります。私のWindowsフォームのそれぞれは、(リポジトリを拡張する)1つ以上のDAOの独自のインスタンスを持ち、リポジトリ内のDataContextは静的です。私が実行している問題は、下のリポジトリクラスのDataContextが静的として宣言されているにもかかわらず、それぞれ異なるDAOが実際にDataContextの別のインスタンスを取得していることがわかります。たとえば、CustomerDAOへの参照が8つある場合、それらはすべて同じDataContextを持ちます。しかし、私が1つのWorkOrderDAOを作成すると、DataContextの別のインスタンスが得られ、今後のすべてのWorkOrderDAOのインスタンスが同じDataContextを取得します。具体的には、次のような状況でこれを発見しました。

1)WorkOrderDAOのインスタンスを使用して、すべてのWorkOrdersをListViewにロードします。 - 1つのDataContextを持ちます。 2)WorkOrderJobsDAOのインスタンスを使用して、WorkOrderのジョブの1つを削除しようとします。これはWorkOrderのコレクションです。別のDataContextを持っているので接続できません

これはリポジトリの実装方法に問題がありますか?この問題を解決するために私が考えることができるのは、リポジトリがその 'DataContext'を取得するために使用するシングルトンを作成することだけです。コンテキストをどのように管理すべきか、誰でもここで何か推奨することはできますか? C#で

public class Repository<T> : IRepository<T> 
where T : class 
{ 
    private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
    protected static DomainClassesDataContext db = new DomainClassesDataContext(); 
    private static bool dataContextOptionsInitialized = false; 

    public Repository() 
    { 
     if (!dataContextOptionsInitialized) 
     { 
      db.DeferredLoadingEnabled = true; 
      dataContextOptionsInitialized = true; 
     } 
    } 
    public void AddEntity(T entity) 
    { 
     GetTable.InsertOnSubmit(entity); 
     SaveAll(); 
    } 

    public void DeleteEntity(T entity, bool attach) 
    { 
     if(attach) 
      GetTable.Attach(entity); 

     GetTable.DeleteOnSubmit(entity); 
     SaveAll(); 

    } 

    public void UpdateEntity(T entity, bool attach) 
    { 
     if(attach) 
      GetTable.Attach(entity, true); 
     SaveAll(); 

    } 

    public System.Data.Linq.Table<T> GetTable 
    { 
     get { return db.GetTable<T>(); } 
    } 

    public IEnumerable<T> All() 
    { 
     return GetTable; 
    } 

    public void SaveAll() 
    { 
     db.SubmitChanges(); 

    } 
} 
+0

これはウェブアプリですか、デスクトップアプリですか? – DOK

+0

これは、ボート修理のサービス作業指示書と見積もりを処理する基本的なデスクトップアプリケーション用です。 – Grasshopper

+1

質問をWinFormsまたはWPFでタグ付けすると便利です。そのため、Web開発者はDataContextを開いたままにしておき、自分の質問に適切な注意を喚起するという提案が表示されても気にならないでしょう。私はデータベースのタグを削除し、これで置き換えます。 – DOK

答えて

1

ジェネリッククラスは、コンパイルの「拡大」を取得しますので、あなたのリポジトリは、静的変数があなたのDTOの間で異なるインスタンスである理由である、Repositoryとは別のクラスになります。だから、おそらく、シングルトンクラスのように別の場所に保存したいと思うかもしれません。

+0

ありがとう、私は今私の現在のデザインのために動作すると思うコンテキストを格納しているシングルトンクラスを作成しました。一般的に、この実装はデータアクセスレイヤーを実装する方法には意味がありますか?基本的に、すべてのDAOはリポジトリを拡張し、追加のデータアクセスメソッドを追加します。ジェネリッククラスを削除し、基本的な操作を実行するためにその内部にlinqクエリを持つジェネリックdaoを書く方が良いでしょうか?私はまだこれらの一般的なクラスに精通しています。 – Grasshopper

関連する問題