2

新しい SubSonic 3 プレビューを試していますが、MVC プロジェクトで基本的な CRUD 操作に使用すべきパターンがよくわかりません。

モデルにできるだけ多くのデータ ロジックを保持しようとしているので、各モデルの部分クラスにいくつかの静的 CRUD メソッドを追加しました。

たとえば、単一のレコードのみを持つ構成テーブルがあるとします。したがって、私の部分クラスは次のようになります。

public partial class Configuration{
        // cut down; mocking hooks here IRL
        private static IRepository<Configuration> Table = new MyRepository<Configuration>();

        public static Configuration Retrieve()
        {
            var config = Table.GetAll().FirstOrDefault();
            if (config == null)
            {
                config = new Configuration();
                Table.Add(config);
            }
            return config;
        }

        public static void Update(Configuration target)
        {
            Table.Update(target);
        }
}

現在、構成テーブルには主キーの ID 列があり、テーブルに新しいレコードを追加すると、標準の「ID 列に明示的な値を挿入できません」というエラーがスローされるため、これは機能しません。SubSonic 3 は、それらを新規作成したときに、データベース スキーマの規則にうまく対応するクラスを生成しないようです (つまり、デフォルト値がない、データベースで null 可能な値に対して null 可能なプリミティブがないなど)。

現在、テーブルとパターンを変更してこれらの問題を回避できますが、この問題を回避できない場合、つまりデータベースに新しいレコードを追加し、ID を主キーとして持つ必要がある場合について考えています。

このパターンが正しいかどうかも疑問です。SubSonic では、リポジトリ ビジネスを行うためのさまざまな方法が提供されているため、どれを使用すればよいかわかりません。私は自分のモデルをできるだけ多く使用したいので (そうでなければ、Linq to Sql だけではないのでしょうか?)、モデルを CRUD しようとするときに SubSonic のクエリ構築機能を使用したくありません。

ここで何をすべきですか?私の MVC プロジェクトで SubSonic 3 を使用するための CRUD パターンに関するアドバイスは歓迎します。また、SubSonic 3 のこの主題をカバーしているが、Google 検索で上位にランクされていない Web サイトへのリンクも歓迎します...


ロブに直接尋ねた(リンクはこちら)。少なくとも私の DB では、生成されたコードに致命的なバグがあります。ああ、アルファソフトウェア。


アップデート

Subsonic3 のリリースに伴い、この質問を再考するためのちょっとしたきっかけをいただけますか?

4

1 に答える 1

3

何よりもまず、必要に応じて SS3 で変更できる t4 テンプレートがあります。それが T4 を使用する際の主なアイデアでした。

当面の質問に対して - これは、PK フィールドに値を貼り付けることを拒否するテンプレートのバグである可能性があると思います。

    ISqlQuery BuildInsertQuery(T item) {
        ITable tbl = _db.FindTable(typeof(T).Name);
        Insert query = null;
        if (tbl != null) {
            var hashed = item.ToDictionary();
            query = new Insert(_db.Provider).Into<T>(tbl); ;
            foreach (string key in hashed.Keys) {
                IColumn col = tbl.GetColumn(key);
                if (!col.IsPrimaryKey) {
                    query.Value(key, hashed[key]);
                }
            }
        }
        return query;
    }

これで、私たちの小切手は実際には...

                if (!col.IsPrimaryKey && !col.AutoIncrement) {
                    query.Value(key, hashed[key]);
                }

このようにして、非同一性が挿入されます。しかし、ここであなたの問題を読むと、あなたは非アイデンティティに挿入しようとしていないように思えます。

あなたが私に送った電子メールは、アイデンティティとしての PK について何も述べていませ

この問題を回避できないとき、つまりデータベースに新しいレコードを追加し、ID を主キーとして持つ必要があるときについて考えています。

これは、SubSonic が想定していることです。PK は IDENTITY 列です。IDENTITY 列しかない場合、これはデッドロックされたテーブルであり、値を挿入できないため、IDENTITY 列にチェックを入れることはできません。この時点での唯一の手段は、目的を無効にする SET IDENTITY INSERT="off" です。

うまくいけば、これはあなたの質問に答えますか?うまくいかない場合は、次のことを行っていただけますか。

  1. 一文: 何ができないのか、何がエラーなのか
  2. 何を期待していましたか

ウィルに感謝します。太っていないことを願っています。

于 2009-01-30T20:06:55.357 に答える