Mvc 3 Scaffolding: модель, переданная в View, выдает ошибку SQL - PullRequest
0 голосов
/ 05 августа 2011

Это сообщение было сильно отредактировано и обновлено!

Намерение:

Я пишу приложение, которое по сути является мини-пакетом учета 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, который, кажется, выбирает практически все в базе данных.Я понятия не имею, почему этот массивный запрос вызывается в отличие от простого выбора для данных транзакции.Предположительно, он пытается загрузить все связанные данные, но я не просил об этом.

Опять же, я подчеркиваю, что с использованием кода, сначала сгенерированного БД, все работает.Но, используя мою ранее существующую базу данных, она выдает ошибку, показанную выше.

Две проблемы здесь:

  1. Одна ошибка.Почему это происходит ??

  2. Другой - это огромный оператор выбора для почти всех данных в БД !!

Мой взглядтолько пытается выложить список учетных записей.Меня не интересуют (для этого представления) таблицы 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 остается без ответа.

1 Ответ

3 голосов
/ 13 августа 2011

вопрос б: причина, по которой вы получаете сообщение об ошибке в уже существующих столбцах базы данных, заключается в том, что они не соответствуют соглашениям об именах столбцов, которые codefirst использует для настройки своих собственных отношений для использования базы данных в том виде, в каком она существует, вам необходимо использовать в своих моделях переменное отображение или атрибуты столбцов определить, какими должны быть отношения

лучший способ сделать это для настройки API для первого кода - не использовать edmx для генерации ваших классов, используйте вместо этого инструментальные средства управления контентом Entity Framework

я бы также попытался сделать это вручную ваши первые пару раз после генерации, чтобы узнать беглый API и как он работает

так как есть несколько различных шаблонов, которые вы можете использовать с ним

чтобы ответить на ваш вопрос о вводе всех данных, он не делает это каждый раз, когда делает это один раз во время компиляции, чтобы создать файл данных всего в базе данных, а затем отслеживает его на предмет изменений, чтобы повысить производительность, чтобы он не имел каждый раз попадать в базу данных

вопрос а: функция AllIncluding позволяет вам запрашивать данные, если вы этого не хотите, затем удалите их и замените на то, как вы хотите запрашивать данные

вопрос d:

вы можете написать свои собственные файлы t4, чтобы генерировать любой код, который вы хотите, они являются шаблонами и разработаны специально для этой цели

вопрос f:

нет никаких специфических для 4.1 книг, о которых я знаю, поскольку платформа codefirst является совершенно новой, я нашла только те, в версии 4.0 однако в настоящее время есть 2 книги о mvc 3, которые, как я знаю, охватывают некоторые аспекты платформы codefirst, которые являются профессиональными asp.net mvc 3 (Wrox) и pro asp.net mvc 3 (apress) и доступны на amazon около 35-40 долларов каждый

...