2011-07-13 5 views
3

私はmvc 3プロジェクトのためにsqlにlinqを使用しています。ドメインモーダルクラスファイルを生成する方法はいくつかあります。LINQ to SQLのクラスを生成する方法は?

  1. sqlmetal
  2. オブジェクトリレーショナルデザイナー
  3. 手コード

私は常に手コード、それらのモデルクラスファイル。なぜなら、sqlmetalやデザイナーによって生成されたファイルは乱雑ですからです。あなたの意見は何ですか?それを行うための最良の方法は何ですか?

EDIT:

私はMVC 3ではなく2を使用していますたぶん私は間違っているが、これは私が検証する方法です。とにかくこれらのクラスファイルをすべて書き終えるつもりです、それで、それらを生成するためのツールを使用するポイントは何ですか?

public class User 
{ 
    [Required] 
    public string Password { get; set; } 
    [Required, Compare("Password")] 
    public string ComparePassword { get; set; } 
} 
+0

ツール(L2S、T4など)を使用するポイントは、何かを手書きで書くときはいつでも間違いを起こしやすいということです。加えて、それはすべてのものを結ぶ心の衰えの退屈からあなたを救う。記述する* EXACT *構造を生成するT4テンプレートがありますが、これについて考える必要はありません。オブジェクトモデルが変更されるたびに再生成するだけです。これにより、実際のアプリケーションロジックに焦点を当てることができます。 – GalacticCowboy

+0

私はまた、自分自身を繰り返すこと(DRYの原則に違反している)は、最高の時間を浪費し、最悪のエラーを起こしやすいと付け加えます。一例として、文字列の長さを一度指定するだけでよい。それをあなたのテーブルの中でやり直し、あなたのオブジェクトでやり直すなら、あなたの努力を倍増させ、同期が外れる危険性があります。これを回避することは、どのように行うか、どのデータアクセス技術を使用するかにかかわらず、コードジェネレーションの大きな利点です。 Entity Frameworkは、実際にはVSからT4テンプレートを提供することで、これを採用しています。クロスDBクエリとより良いクエリロギングをサポートしていれば、おそらく切り替えるでしょう。 – mattmc3

答えて

4

複数のデータベース(1つのサーバー)に数百のテーブルがあります。テーブルの最初の開発を行い、それぞれのプロジェクト内の異なる名前空間を表す異なるフォルダにそれぞれ異なるDBMLデザイナーファイルにテーブルをドラッグします。デザイナーファイルはコンパイルされないようにマークされており、プロジェクトにあるDBMLファイルを読み込んでコードを生成するカスタムビルドT4テンプレートを使用します。これにより、生成されたコードを完全に制御できるようになり、インターフェースを実装することができます(IAuditableはCreatedBy、CreatedDate、ModifiedBy、ModifiedDateがある例です)。また、Buddy Classesに頼らずに、LinqedオブジェクトにSystem.ComponentModel.DataAnnotationsをこのように配置することもできます。データベースからDBMLをリフレッシュする2番目のT4テンプレートがあるので、テーブルに3つの部分の接頭辞(db.schema.tbl)が付いていることを確認できるので、削除する必要はありません。デザイナー。 XMLは、dbスキーマの読み取りとDBMLの更新に基づいて変更されます。また、GetByID()のような一般的なクエリ操作をいくつか持ち、コミットと監査ログを処理する各POCOのリポジトリ/マネージャオブジェクトも生成します。これらのマネージャは、各テーブルに対して作成する必要があるすべてのカスタムクエリで拡張され、DataContextを所有します。このデザインは時々「ママ・イ・私」と呼ばれます。アプローチは、テーブルにLinqedオブジェクトは、そのためにすべてを行うためにマネージャに尋ねなければならない。

これはL2Sの非常に多目的で滑らかな方法であることがわかりました。私たちはバックエンド開発を手軽にしてユーザーエクスペリエンスを重視することができました。唯一の欠点は、ネームスペース間でアソシエーションを行う場合、アソシエーションを描画するために、別のDBMLにその外部テーブルを追加する必要があるため、手動でパーシャルクラスにそれらを手動で追加する必要があることです。これは実際に私たちの名前空間の特異性について本当に考えて、余分なものを減らすような悪いことではありません。この方法でT4を使用すると、DRYを開発する素晴らしい方法です(自分自身を繰り返さないでください)。テーブル定義は、構造を変更する必要がある唯一の場所であり、すべてが伝播します。検証は1つの場所、POCOに入ります。クエリは1か所、マネージャーに入ります。同様のことをしたい場合は、here's a good place to start

+0

私はMVC 3を使用しています。まだ検証のためにすべてのクラスを記述する必要があります。これらのツールを使用して生成することができます。パブリッククラスユーザー { [必須] public string Password {get;セット; } [必須、Compare( "Password")] パブリック文字列ComparePassword {get;セット; } } – qinking126

+0

MVC 3も使用しています。私たちが生成した生成クラスは、Linq-to-SQLの部分的なものです。たとえば、DBテーブルのカラムでNULLが許可されていない場合は、[必須]属性が文字列の長さなどに加えて追加されます。 – mattmc3

+0

また、ビジネス用に実装できるすべてのクラスに対して検証メソッドが用意されています論理検証。だから、あなたが書いた唯一のコードは、あなたが実際に書く必要があるコード、すなわちクエリとビジネスの検証です。残りの時間は、ユーザーエクスペリエンスに必要な場所に集中することができます。 – mattmc3

0

デザイナで生成されたクラスでさえ乱雑ですが、何が重要ですか?

デザインファイルのいずれかを開く必要はありません。

あなたがモデルで定義されたエンティティのいずれかを拡張する必要がある場合は、あなただけの同じ名前の独自の部分クラスを作成し、自分のものを実装することができるように、彼らはすべての部分クラスである...

私はありませんL2Sを使用して、私はデザイナーを使用します。

関連する問題