Это сообщение было сильно отредактировано и обновлено!
Намерение:
Я пишу приложение, которое по сути является мини-пакетом учета ASP.NET MVC 3.Я делаю это для изучения EF 4.1 Code First и Scaffolding
Настройка:
Я использую SQL Server 2008 Express, Visual Studio 2010 SP1 и ASP.NET MVC 3 с Mvc Scaffolding 1.0.2.
У меня есть база данных.База данных содержит следующие таблицы:
Accounts
Banks
CostCentres
Currencies
DebitCredits
People
Transactions
TransactionTypes
Существует ряд взаимосвязей, например, Person_Accounts и т. Д.
Теперь я хочу использовать MVC Scaffolding для создания некоторых входных страниц для создания данных.для поиска таблиц в моей базе данных.
То, что я пробовал:
Я создал .edmx и использовал его для создания классов POCO, используя автогенерацию t4.Исключив .edmx, как только у меня появятся классы POCO.
Обошли проблему кода EF 4.1. Сначала не находите понравившуюся строку подключения, поэтому отключитесь и создайте собственную базу данных SQL Express (см. * 1022).* Rachel Appels блог для подробностей по этому вопросу )
Наконец-то использовали имя контекста соглашения = имя строки подключения, чтобы сначала получить код EF, чтобы поговорить с правильным БД.
У меня естьзатем использовал MVC 3 Scaffolding, чтобы поменять местами виды.Так что код репозитория, который создается, принадлежит не мне, а Стиву Сандерсону.
Раньше я не использовал EF, поэтому надеялся, что это будет способ перехода от LINQ к SQL с помощью метода «смотри и учись».
Оказывается, у меня проблемы ...
Проблема:
Прежде всего, если я использую базу данных, созданную EF Code. Во-первых, проблем нет.,
Но измените строку подключения на мою ранее существующую базу данных (которую я использовал для создания файла .edmx). Теперь я получаю следующую ошибку, когда, например, я запрашиваю представление Index в скаффолде для сущности 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 Profiler, он показывает запись SQL: BatchStarting с массивным запросом SELECT, который, кажется, выбирает практически все в базе данных.Я понятия не имею, почему этот массивный запрос вызывается в отличие от простого выбора для данных транзакции.Предположительно, он пытается загрузить все связанные данные, но я не просил об этом.
Опять же, я подчеркиваю, что с использованием кода, сначала сгенерированного БД, все работает.Но, используя мою ранее существующую базу данных, она выдает ошибку, показанную выше.
Две проблемы здесь:
Одна ошибка.Почему это происходит ??
Другой - это огромный оператор выбора для почти всех данных в БД !!
Мой взглядтолько пытается выложить список учетных записей.Меня не интересуют (для этого представления) таблицы CostCentres или Currency и т. Д. И т. Д. И т. П.
Вопросы:
a.Почему репозиторий Scaffolded запрашивает ВСЕ данные?
b.Почему ошибка происходит в ранее существующей базе данных?
Я назначил вознаграждение по этому вопросу, и тот, кто ответит на два вышеупомянутых вопроса, получит вознаграждение.
Другие вопросы (не связанные сщедрость!):
c.Кто-нибудь знает ссылки на блоги, где я могу прочитать о том, что я должен делать, чтобы использовать леса MVC 3 и сначала кодировать с существующей базой данных?
* * D одна тысяча восемьдесят шесть. Есть ли способ использовать шаблоны t4 для создания файла DbContext, который правильно сопоставляется с существующей базой данных со всеми ее связями и т. Д.?
е. Любое другое предложение (кроме смены карьеры)?
е. Какие-нибудь книги для чтения на EF 4.1 Code First? (Последняя версия Джулии Лерман - EF 4.0, т. Е. Код впервые был только в бета-версии на момент публикации).
Обновление:
Я ответил на вопрос a (Почему огромный запрос приносит все данные. В репозитории scaffolded есть метод:
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 остается без ответа.