この投稿は大幅に編集および更新されています。
意図:
本質的にミニ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つは、データベース内のほぼすべてのデータに対する巨大な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は未回答のままです。