1

SQL Serverデータベーステーブル用にC#でデータアクセス層を作成しています。データアクセス層には、テーブルの各列のプロパティと、データベースからデータを読み書きするためのメソッドが含まれています。読み取りメソッドをインスタンスベースにすることは理にかなっているようです。私が持っている質問は、データベースで生成された主キープロパティのgetter/setterとwriteメソッドの処理に関するものです。私の知る限り、私には3つの選択肢があります...

オプション1:主キーのゲッターのみを許可しながら静的メソッドを使用すると、データベースにすべての正しい値を強制的に書き込むことができますが、開発者としては扱いにくいです。

オプション2:インスタンスベースの書き込みメソッドを使用すると、より保守しやすくなりますが、主キーのget / setをどのように処理するかわからないため、書き込みを行う前に、インスタンスの何らかの検証を実装する必要があります。データベース。

オプション3:他の何か、しかし私はLINQとドラッグ/ドロップのものに警戒しています、彼らは以前に私を燃やしました。

ここに標準的な方法はありますか?たぶん私はしっかりしたチュートリアルへのリンクが必要ですか?

4

5 に答える 5

3

アクティブなレコードパターンとそのいくつかの例を読んでから、独自のクラスを実装することをお勧めします。

これは、いくつかの基本的な概念を含む単純なクラスの大まかなスケッチです(以下)。

このアプローチに従うと、ニーズに合わせてパターンを拡張できます。DBからオブジェクトとしてレコードを取得し、その値を変更してから、レコードを更新しても問題ない場合があります(オプション2)。または、オーバーヘッドが大きすぎる場合は、データベース内のレコードを直接更新する静的メソッドを使用します(オプション1)。挿入の場合、データベース(SP /クエリ)は、必要に応じてテーブルの自然/一意キーを検証し、おそらく一意の制約エラーを示す特定の値/コードを返す必要があります)。更新の場合、自然キーフィールドの更新を許可する場合は、同じチェックを実行する必要があります。

これの多くは、アプリケーションが特定のテーブルに対してどの機能を許可するかによって異なります。

私は静的メソッドよりも、DBからオブジェクトを取得してから、値を変更して保存することを好む傾向があります。私にとっては、コードを呼び出すことで使いやすく、クラス内の難解なビジネスロジックを簡単に処理できます。

public class MyEntityClass
{
    private int _isNew;
    private int _isDirty;
    private int _pkValue;
    private string _colValue;

    public MyEntityClass()
    {
        _isNew = true;
    }

    public int PKValue
    {
        get {return _pkValue;}
    }

    public string ColValue
    {
        get {return _colValue;}

        set
        {
            if (value != _colValue)
            {
                _colValue = value;
                _isDirty = true;
            }
        }
    }

    public void Load(int pkValue)
    {
        _pkValue = pkValue;

        //TODO: query database and set member vars based on results (_colVal)

        // if data found
        _isNew = false;
        _isDirty = false;
    }

    public void Save()
    {
        if (_isNew)
        {
            //TODO: insert record into DB
            //TODO: return DB generated PK ID value from SP/query, and set to _pkValue
        }
        else if (_isDirty)
        {
            //TODO: update record in DB
        }
    }
}
于 2012-04-18T01:37:14.250 に答える
2

EntityFrameworkをご覧になりました。LINQに警戒しているとおっしゃっていましたが、EF4はあなたが言及した多くのことを処理し、DALのかなり標準的な方法です。

于 2012-04-18T00:31:08.103 に答える
0

完全に制御する必要がある(望まない)カスタマイズされたdalが必要でない限り、私はORMツール(EF、TelerikによるOpenAccessなど)を使い続けます。サイドプロジェクトでは、ORMを使用します-仕事では、プロバイダーの抽象化とオブジェクトとデータベース間のカスタムマッピングを備えた独自のカスタムDALがあります。

于 2012-04-18T01:31:47.903 に答える
0

Nhibernateは、大規模なコミュニティが支援している、非常に堅実で真のORMでもあります。

于 2012-04-18T02:03:11.017 に答える
0

Entity Frameworkは、最初のDALを取得し、必要な場所で最適化する方法です。当社は、EFとSQLリーダーを比較する際に実際にベンチマークを実行し、データベースに1つまたは2つのテーブルに相当する情報をクエリする場合の速度を確認しました。は約6です(どちらも他よりもかなり高速ではありません)。2つのテーブルの後、パフォーマンスが低下しますが、それほど重要ではありません。独自のSQLステートメントを作成する価値があったのは、バッチコミット操作でした。この時点で、EFを使用してSQLクエリを直接記述できます。したがって、時間を節約し、基本的な重量物の持ち上げにEFを使用してから、より複雑な操作に直接接続を使用します。(両方の長所です)

于 2014-08-14T15:10:53.640 に答える