0

この投稿は大幅に編集および更新されています。

意図:

本質的にミニASP.NETMVC3アカウンティングパッケージであるアプリを書いています。私はEF4.1コードファーストとスキャフォールディングを学ぶためにそれをやっています

セットアップ:

SQL Server 2008 Express、Visual Studio 2010 SP1、およびASP.NETMVC3とMvcScaffolding1.0.2を使用しています。

既存のデータベースがあります。データベースには次のテーブルがあります。

Accounts
Banks
CostCentres
Currencies
DebitCredits
People
Transactions
TransactionTypes

Person_Accountsなど、いくつかの関係があります。

ここで、MVC Scaffoldingを使用して、データベース内のルックアップテーブルのデータを作成するための入力ページを作成したいと思います。

私が試したこと:

.edmxを作成し、それを使用してt4自動生成を使用してPOCOクラスを作成しました。POCOクラスを取得したら、.edmxを除外しました。

EF 4.1コードの問題を回避しました。最初に適切な接続文字列が見つからないため、独自のsql expressデータベースを作成します(この落とし穴の詳細については、Rachel Appelsブログを参照してください) 。

最後に、慣例のコンテキスト名=接続文字列名を使用して、最初にEFコードを取得して正しいデータベースと通信しました。

次に、MVC3スキャフォールディングを使用してビューのスキャフォールディングを行いました。したがって、生成されるリポジトリコードは私自身のものではなく、SteveSandersonのものです。

私はこれまでEFを使用したことがないので、これが「ルックアンドラーン」によってLINQからSQLに進む方法になることを望んでいました。

結局、私はいくつかの問題を抱えています...

問題:

まず、EFコードファーストで作成したデータベースを使えば問題ありません。

ただし、接続文字列を既存のデータベース(.edmxファイルの作成に使用したもの)に変更します。たとえば、Accountsエンティティのスキャフォールディングされたインデックスビューを要求すると、次のエラーが発生します。

Invalid column name 'Account_AccountId'.
Invalid column name 'Account_AccountId'.
Invalid column name 'Currency_CurrencyId'.
Invalid column name 'Transaction_TransactionId'.
Invalid column name 'Account_AccountId1'.
Invalid column name 'Account_AccountId'.
Invalid column name 'Account1_AccountId'.
Invalid column name 'CostCentre_CostCentreId'.
Invalid column name 'Currency_CurrencyId'.
Invalid column name 'TransactionType_TransactionTypeId'.
Invalid column name 'Account_AccountId1'.
Invalid column name 'Account_AccountId2'.
Invalid column name 'Account_AccountId2'.
Invalid column name 'Account_AccountId'.
Invalid column name 'Account1_AccountId'.
Invalid column name 'CostCentre_CostCentreId'.
Invalid column name 'Currency_CurrencyId'.
Invalid column name 'TransactionType_TransactionTypeId'.
Invalid column name 'Account_AccountId1'.
Invalid column name 'Account_AccountId2'.

- ノート: -

EFによって作成されたデータベースと私によって作成されたデータベース(非常に単純)の唯一の違いは、関係といくつかのトリガー、およびEdmMetadataテーブルです。

-注記の終わり--

私の理由:

この理由は、一見すると非常に奇妙なエラーです。関連データのないアカウントのリストが必要なだけなのに、何が起こっているのかは次のとおりです。

既存のデータベースまたは最初にコードによって作成されたデータベースのいずれかを使用して、SQLプロファイラーをチェックインすると、データベース内のほぼすべてを選択しているように見える大規模なSELECTクエリでエントリSQL:BatchStartingが表示されます。トランザクションデータの単純な選択ではなく、この大規模なクエリが呼び出される理由がわかりません。おそらく、すべての関連データを読み込もうとしていますが、私はそれを求めていません。

繰り返しになりますが、最初に生成されたdbを使用すると、すべてが機能することを強調します。しかし、私の既存のデータベースを使用すると、上記のエラーショーがスローされます。

ここでの2つの問題:

  1. 1つはエラーです。なぜそれが起こるのですか?

  2. もう1つは、データベース内のほぼすべてのデータに対する巨大なselectステートメントです。

私の見解は、アカウントレコードのリストを吐き出そうとしているだけです。CostCentresやCurrenciesテーブルなどには(このビューでは)興味がありません。

質問:

a。Scaffoldedリポジトリがすべてのデータを要求するのはなぜですか?

b。既存のデータベースでエラーが発生するのはなぜですか?

私はこの質問に報奨金を設定しました。上記の2つの質問に答えた人は誰でも報奨金を受け取ります。

その他の質問(バウンティとは関係ありません!):

c。MVC 3スキャフォールディングを使用して既存のデータベースで最初にコードを作成するために何をすべきかを読むことができるブログへのリンクを知っている人はいますか?

d。t4テンプレートを使用して、既存のデータベースとそのすべての関係などに正しくマップするDbContextファイルを作成する方法はありますか?

e。他の提案(転職を除く)はありますか?

f。EF 4.1コードファーストを読むための本はありますか?(JuliaLermanの最新版はEF4.0です。つまり、コードは最初に公開時にベータ版でした)。

アップデート:

私は質問に答えました(なぜ巨大なクエリがすべてのデータを取り込むのですか。スキャフォールドリポジトリには次のメソッドがあります:

public IQueryable<Account> AllIncluding(params Expression<Func<Account, object>>[] includeProperties)
        {
            IQueryable<Account> query = context.Accounts;
            foreach (var includeProperty in includeProperties) {
                query = query.Include(includeProperty);
            }
            return query;
        }

これは、Scaffoldedコントローラーから呼び出されます。

//
        // GET: /Accounts/

        public ViewResult Index()
        {
            return View(accountRepository.AllIncluding(account => account.Person, account => account.DebitCredits, account => account.Transactions, account => account.Transactions1));
        }

謝罪いたします。私はあまりにも竹に覆われていました。

しかし、質問bは未回答のままです。

4

1 に答える 1

3

質問b:既存のデータベース列でエラーが発生する理由は、コードファーストがデータベースを使用するための独自の関係を設定するために使用する列の命名規則と一致しないためです。流暢なマッピングまたは列属性を使用する必要があります。モデルで、関係がどうあるべきかを定義します

コードファーストのAPIセットアップでこれを行う最良の方法は、edmxを使用してクラスを生成しないことです。代わりに、エンティティフレームワークのパワーツールctpを使用してこれを行います。

また、流暢なAPIとその仕組みを学ぶために、生成後の最初の数回は手作業でこれを実行しようとします。

あなたがそれで使うことができるいくつかの異なるパターンがあるので

すべてのデータを取り込むことについての質問に答えるために、コンパイル時に一度これを行うたびにこれを行うわけではなく、データベース内のすべてのデータファイルを作成し、その後の変更を追跡してパフォーマンスを向上させるため、毎回データベース

質問a:これAllIncludingが必要ない場合は、データをクエリできるようにする関数があります。次に、データを削除して、データのクエリ方法に置き換えます。

質問d:

独自のt4ファイルを作成して、テンプレートであり、この目的のために特別に設計されたコードを生成できます。

質問f:

私が知っている4.1の特定の本はまだありません。コードファーストのフレームワークは真新しいので、バージョン4.0でしか見つけられませんでしたが、現在、コードファーストのいくつかの側面をカバーしていることを知っている2つのmvc3の本があります。プロのasp.netmvc3(Wrox)とプロのasp.net mvc 3(apress)であり、どちらもアマゾンでそれぞれ約35〜40ドルで利用できるフレームワーク

于 2011-08-13T16:56:56.247 に答える