2010-12-04 15 views
0

C#C#のデータベースとの対話

で、ユーザーデータベースとの対話を処理するための最も一般的な方法だろう何がeasillyデータベースドライバ(データプロバイダ)を交換することができることを期待しています。

また、私は絶対に別の何かに何かDB-よう(例えば、無地MySQLデータベース)からデータソースを切り替えることができれば、それは素晴らしいことだという(それが可能だかどうかわからない)を考える - などのデータxmlまたは任意のバイナリファイルにシリアライズされます。 最後のケースでは、いくつかのQuery-Fileインタラクションラッパーなどを書く必要があると思われます。


だから、 - 誰かは説明した動作を実現するための方法を共有するだろうか?

私の質問にはLINQを間違いなく使用することができますが、いくつかの抽象化について紹介していますが、データソースを交換可能にするには十分ですか?

「はい」の場合、実際にこれを実現するにはどうすればよいのですか、開発パイプラインはどのように見えますか?

ありがとうございました。

答えて

2

はEF Frameworkを使用して、小さなリポジトリー柄チュートリアルです:

someRepository.Find.Where(something => something.IsRed && something.IsBig) 

データアクセスのためのすべてのメソッドを含むタイプTの「IRepository」と呼ばれる一般的なインタフェースを作成します。

それは次のようになります。

interface IRepository<T> where T : class 
{ 
    IEnumerable<T> FindAll(Expression<Func<T, bool>> exp); 

    T FindSingle(Expression<Func<T, bool>> exp); 

    // And many more! 
} 

は、このインタフェースを実装する抽象「リポジトリ」クラスを作成します。

class Repository<T> : IRepository<T> where T : class 
{ 
    TestDataContext _dataContext = TestDataContext(); // Would be your EF Context 

    public IEnumerable<T> FindAll(Expression<Func<T, bool>> exp) 
    { 
     _dataContext.GetTable<T>().Where<T>(exp); 
    } 

    public T FindSingle(Expression<Func<T, bool>> exp) 
    { 
     _dataContext.GetTable<T>().Single(exp); 
    } 

    // And many more! 
} 

我々は今、私たちを実装ModelClassテーブル/オブジェクトのためのインタフェースを作成することができます'IRepository'と抽象的な 'Repository'クラスを拡張し、 'IModelClassInterface'を実装する具象クラス:

interface IModelClassRepository : IRepository<ModelClass> 
{ 
} 
それはあなたに多くの柔軟性だけでなく、あなたが持っているすべての小さなエンティティを制御するのに十分な力を与えるように私はこのアプローチを使用することをお勧めし

class ModelClassRepository : Repository<ModelClass>, IModelClassRepository 
{ 
} 

そして、それを実現するために、一致するリポジトリ。

これらのメソッドを呼び出すと、そのように超簡単になります。

ModelClassRepository _repo = new ModelClassRepository(); 
_repo.Find.Where(something => something.IsRed && something.IsBig) 

はい、それはあなたがいくつかの仕事をしなければならないが、地獄あなたが後でデータソースを変更するために簡単であることを意味します。

EFフレームワークを任意のデータプロバイダで切り替えることもできます。それはXML、db4o、または普通の古いTxtです。

0

リポジトリパターンをルックアップする必要があります。

Asp.netも等

+1

リポジトリ私の見解では、良いデータベース抽象化ツールに加えてパターンを使用する必要があります。 –

+0

ええ、リポジトリパターンを使用して、コードが特定のデータベースに依存しないようにしてから、Entity Frameworkなどの適切なormを使用して、SQLと変更追跡の処理の頭痛を取り除きます。 – rtpHarry

0

1ワードメンバシッププロバイダ、サイトマッププロバイダとしてスワップ可能なコンポーネントを作成するプロバイダパターンとして知られているものを利用します。

NHibernateの

NH3.0は、LINQをサポートし、PosgresまたはMyFailSQL用のSQL Serverを交換してそのtrival。

"データがxmlまたは任意のバイナリファイルにシリアル化されているのと同じです。"これが何を意味するかわからない。

+0

私はNHibernateを "Generic"と呼ぶことはしませんが、SQL ServerからMySQLへのDBのスワッピングをサポートします。 –

+0

L2S、EF、LightSpeedなどを使うよりも一般的ではありませんが、LINQタイプのクエリを使用してDBを交換することができます。 – Phill

0

.NETフレームワークのデファクトスタンダードはEntity Frameworkです。最近のEFバージョン4がリリースされたため、EFのオンラインで見つかった批判を塩の穀物で拾い読みしてください。古いバージョンで多数の懸案事項に対処しています。今は、私の考えでは、.NET空間(私が試したことがある)の中で最高のデータベース抽象化ツールです。

LINQ to SQLに注意してください。マイクロソフトでは、EFがこの分野の旗艦になっているため、製品の改善に多くのリソースを投入する可能性はほとんどありません。

+0

また、これを初めて使用する場合は、LINQとLINQ to SQLが同じでないことにも注意してください。 – rtpHarry

0

LLBLGen Proをご覧ください。私たちはORMを使用しており、競争を吹き飛ばしています。新しいバージョンでは、ツールを使用して、複数のフレームワーク(エンティティフレームワーク、nhibernate、linq-to-sql)のコードを生成することができます。しかし、そのフレームワークは多くのシナリオで最も柔軟性が高いようです。

Fransから彼のblogの詳細を調べることができます。彼はLLBLGenのメインのLLBLGen指導者であり、LLBLGenのオリジナルクリエイターです。ここで

+0

アダプター・モデルを使用すると、エンティティーとデータベース・ドライバーは完全に分離されており、サポートされているデータベース・ドライバーにエンティティーを指すことができます。 –

0

"C#でユーザーとデータベースのやりとりを処理する最も一般的な方法は何ですか?"

最も一般的な方法は、ADO.NET ... DBのストアドプロシージャへの呼び出しやSQLのブロックだけですが、それは利点があります。しかし、OOPには簡単には抽象化されていないので、多くの欠点があります。インテリジェンスはありません... EFは、これらの欠点の多くに対処するので非常にクールですが、構文が新しくなれば少し慣れるでしょう。

関連する問題