74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
|
|
1 | |
Сломался метод Create, как починить?23.06.2020, 09:16. Показов 5319. Ответов 13
Метки нет (Все метки)
Уважаемые знатоки, к вам очень интересный вопрос: как могло сломаться то, что целую неделю не трогали?
Создала метод Create, работал хорошо, новые записи создавались в бд правильно, приступила к другому, но вдруг спустя неделю решаю проверить и метод просто не работает. Временная переменная не изменяется как это было. Ошибка : The property 'IdApartment' on entity type 'Apartments' has a temporary value. Either set a permanent value explicitly or ensure that the database is configured to generate values for this property. Полное описание: Microsoft.EntityFrameworkCore.Update.Internal.CommandBatchPreparer.Validate(Modi ficationCommand modificationCommand) Microsoft.EntityFrameworkCore.Update.Internal.CommandBatchPreparer.BatchCommands (IReadOnlyList<IUpdateEntry> entries)+MoveNext() Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(DbContext _, ValueTuple<IEnumerable<ModificationCommandBatch>, IRelationalConnection> parameters) Microsoft.EntityFrameworkCore.Storage.Internal.NoopExecutionStrategy.Execute<TSt ate, TResult>(TState state, Func<DbContext, TState, TResult> operation, Func<DbContext, TState, ExecutionResult<TResult>> verifySucceeded) Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable< ModificationCommandBatch> commandBatches, IRelationalConnection connection) Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IReadOnlyLi st<IUpdateEntry> entries) Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(I ReadOnlyList<InternalEntityEntry> entriesToSave) Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(b ool acceptAllChangesOnSuccess) Microsoft.EntityFrameworkCore.DbContext.SaveChanges(bool acceptAllChangesOnSuccess) Microsoft.EntityFrameworkCore.DbContext.SaveChanges() WebMena.Controllers.ContractsController.Create(IndexViewModel indexView) in ContractsController.cs + _context.SaveChanges(); Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor+TaskOfIActionResultExecut or.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments) System.Threading.Tasks.ValueTask<TResult>.get_Result() Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsyn c() Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilter Async() Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecuted Context context) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync () Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContex t context) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpCon text context)
0
|
23.06.2020, 09:16 | |
Ответы с готовыми решениями:
13
Сломался ноутбук MSI GX 640 как починить без СЦ Возможно ли реализовать через bitmap метод BitmapSource.Create WPF-ный? Как починить? Как починить wi-fi на ноутбуке НР? |
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
26.06.2020, 23:21 | 2 |
"Ошибка" однозначно говорит, что дело в IdApartment.
Откуда у вас этот это йдишник берется в модели и соответствует ли он id соответствующей таблицы (вью) БД - неизвестно. Лучший способ проверить - написать "сбойный" запрос в MS SQL Memegement Studio и попробовать его выполнить. На первый взгляд, Вы пытаетесь добавить этот йдишник явно, но для инкремента это не допустимо. Почему раньше он (айдишник) не указывался при добавлении, а сейчас указывается - надо смотреть весь код контроллера, который в сабже просто отсутствует. Скорее всего имеет место "ошибка с задержкой" в Вашем коде. Кстати, вопрос: этот айди у Вас представлен на страничке добавления, а если представлен, то может ли юзер что-то туда ввести ? Добавлено через 7 минут Чего-то пришло в голову: не пытаетесь ли Вы вручную определить значение id перед вставкой, а потом совать его в запрос (модель) ? Ну что типа Select max(id)+1 from table ? Если, не дай Бог, это так, то Вам надо в 1й класс по основам БД Добавлено через 3 минуты Добавлено через 38 секунд Как узнать ID только что добавленной записи: Добавлено через 1 минуту Почему-то ссылки вырезаются. Тогда вот текст из ссылки: В MS SQL, например: select scope_identity(), чтобы получить последний созданный id в текущем соединении и только текущей области видимости (триггеры и функции игнорируются). select @@identity, чтобы получить последний созданный id на текущем соединении независимо от области видимости (триггеры и функции учитываются). select ident_curent(‘tablename’), чтобы получить последний id на конкретной таблице, созданные на любом соединении.
0
|
74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
|
||||||
29.06.2020, 04:10 [ТС] | 3 | |||||
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
30.06.2020, 02:21 | 4 |
И Вы полагаете, что найдется супертелепат, который поймет, что это за "переменные" и каким боком они связаны с айдишником какой-то таблицы ?
Ясно одно, что Ваши потуги "вычислить" значение нового id - это закат солнца вручную. Короче, 1-й класс, вторая четверть.
0
|
74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
|
|||||||||||
30.06.2020, 04:29 [ТС] | 5 | ||||||||||
переменные IdContract, IdApartment и IdHistoryStatus
три разные таблицы, главная Contracts с уникальным идом, с таблицей Apartments связана внешним ключом, как и с ContractStatusHistory.
Благодарствую за ответы и потраченное время.
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
||||||
02.07.2020, 01:24 | 6 | |||||
Добавлено через 10 минут Оно и видно. В контроллер суете логику работы с моделью - а это бандитизм (с) И что это еще за "чудище обло, озорно, стозевно и лайяй" (с) ? Имеется в виду модель IndexViewModel. Это типа контейнера, куда Вы пытаетесь засунуть все, что можно, включая старые тапочки, дедушкин футляр от очков и вообще все, что лежит на чердаке и подвале ? Почитайте что-нибудь про базы данных. Ну ведь полно материала. На том же метаните, профессорвебе и т.д. ЗЫ. Зачем у вас Async ? Это осмысленно или потому что "дядя" сказал/написал/показал ?
1
|
74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
|
|
02.07.2020, 07:52 [ТС] | 7 |
Ну так я и сама понимаю, что это крайне чудовищно, однако другого способа не нашла. Повторюсь, что неделю не трогала метод, он прекрасно работал без этого извращения, а потом что-то пошло по одну месту... Добавлено через 1 минуту других примеров к сожалению не нашла
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
03.07.2020, 02:11 | 8 |
Не знаю, кто и где Вас учил..
Вот этапы для создания нормального приложения. I. Подготовительный этап 1. Грамотная и исчерпывающая (насколько возможно) постановка задачи. Включает Предметную область, исходные данные, выходные формы (для веб - макет странички) 2. Создание Модели данных "на бумаге". Описание сущностей, их свойств, ограничений, связей друг с другом. Проецирование сущностей в плоские таблицы, написание алгоритмов серверной бизнес логики. Опять же "на бумаге". 3. Разработка алгоритмов обработки данных: представление, отображение, модификация. Снова "на бумаге". II. Этап машинного проектирования 1. Перенос Модели данных + бизнес-логика в проект. Тут варианты: - либо прямо пишете классы и логику на C#, а потом рефлексия на SQL Server готовой модели (Code First/Model First) - либо работаете на SQL-сервере, создавая и отлаживая таблицы, хранимки, UDF и пр. непосредственно на SQL-сервере (Database First) Тут могу дать такой совет: если Вы разрабатываете БД "под проект" и слабо знакомы с SQL, то выбирайте Code-First, правда придется позаботиться о начальной заливке отладочных данных. Если с SQL на "ты" и база уже есть и в ней реальные данные, то DataBase First однозначно. Результатом этапа является Модель, состоящая из классов-сущностей (рефлексия таблиц, вьюшек и т.д.), а также класс Репозиторий, включающий методы работы с классами-сущностями (извлечение, сортировка, пагинация, фильтрация, модификация и пр). Почитать: ORM вообще и Entity Framework в частности 2. Создание контроллера (контроллеров) - Определение метода для аутентификации юзверя (если нужно) - связь с моделью "Юзверь" - Определение метода для стартовой страницы с или без использования профиля авторизированного юзверя - Определение методов для правки данных помодельно - Определение других методов - "Выделить" методы, которые могут вызываться асинхронно (хотя бы комментами для начала) 3. Создание представлений. - Главная страница (класс, по которому должна типизироваться) , включая частичные представления - Частичные страницы (классы для типизации) 4. Создание файлов .css и .js для внесения туда кода стилей и клиентского кода JavaScript 5. Настройка главного представления (линки на Ваши css,js + библиотеки JQuery + Ajax), добавление классов в элементы разметки, назначение обработчиков событий в соответствии с ТЗ (см. п. I.1) 6. Собственно отладка. Все эти этапы есть в книжках и на популярных сайтах-учебниках (рекомендую metanit.com - там все по полочкам) К сожалению, хорошего учебного видеоцикла лично я не нашел. Но что-то можно почерпнуть и там - гугл Вам в помощь Если Вам не в лом все это сделать, то выложите результат файлом. Думаю, найдутся желающие посмотреть (например, я
1
|
74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
|
|
03.07.2020, 04:27 [ТС] | 9 |
База есть , такой подход я использовала применив Scaffold-DbContext, а результате которого получила папку с набором всех таблиц бд, но так как их очень много создала ViewModel с наиболее важными Также автоматически создала CRUD операции и их уже редактировала под себя, минус в том, что на всех сайтах, которые я находила логика была прописана в контроллере, поэтому решила делать также, учитывая уровень знаний в данной теме...
Спасибо вам за столь большой ответ, он очень полезен! Добавлено через 1 минуту буду пытаться поменять свой кошмар((
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
03.07.2020, 13:24 | 10 |
Сообщение было отмечено Talinka как решение
Решение
1. Никаких Scaffold ! Вам надо купить хлеб и молоко, а Вы грузите в тележку весь маркет
Соединяетесь с SQL-сервером, выбираете базу, а потом чекаете только те объекты, которые собираетесь использовать в проекте. Получаете в Model только те классы, с которыми работаете, а также контекст с базовой имплементацией этих классов. Если методов и классов в контексте недостаточно (например, Вам надо получить дополнительный функционал и даже дополнительные классы - типа датасета, которого нет в базе как такового (выборка из нескольких таблиц)), то добавляете в папку Model (но не в папку .edmx !) свой новый класс, а также класс репозитория. И там пишете все, что нужно. Если придется делать ремаппинг базы, то эти классы не "пострадают" 2. Логика в контроллере - бомба замедленного действия. Суть контроллера - это взаимодействие приложения с клиентом. Код манипулирования данными должен быть вынесен из него в Модель (имеется в виду не только модель edmx, но и вся папка Model). Вам хорошо бы простенький пример Добавлено через 15 минут Вот простейший случай Есть бд с двумя таблицами: Group и Students, связанные отношением "один-ко-многим". Т.е. каждый студент "прописан" в одной группе (через forein key). Задача: отобразить на странице все студентов, а также номера групп. В бд такой таблицы нет и быть не должно. Решения два: 1. На стороне SQL Server. Пишете UDF, возвращающую нужный нд со всеми колонками, которые требуется отобразить. Перемаппируете EF добавляя галочку на этой UDF. В результате получаете в модели .edmx новый класс и новый метод в контексте, к которым и привязываетесь в контроллере и строго типизированном представлении. 2. На стороне ORM. Пишете ручками новый класс, в репозиторий добавляете метод, где с помощью linq пишете нужный запрос с join, возвращающий новый класс. (И класс модели, и репозиторий создаете в папке Model, но не .edmx !) Далее все как и в первом случае. Какой выбрать - не скажу. Ибо это вопрос холиварный и все зависит от многих факторов. Например, если в проекте участвует команда, в которой есть люди, отвечающие за ORM, то решается вторым способом. Если разраб один и проект без планового расширения на другие задачи, то лучше метод 1. Лично я предпочитаю первый способ, т.к. нет проблем с SQL
1
|
74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
|
||||||
06.07.2020, 06:34 [ТС] | 11 | |||||
Боже, ваши ответы такие развернутые, большое спасибо, что откликнулись, буду пытаться исправлять тот кошмар, который нагородила!
А у меня возник еще один вопрос, вы случаем не подскажите как сделать двойное подключение? Просто в одной базе существуют про Id улицы, а в другой полная расшифровка
"DefaultConnection": "Server=*** ;Port=*** Database=test1;User Id=***Password=******;" "SecondConnection": "Server=***; Port=*** Database=test2;User Id=***Password=******;" а что происходит в Startup непонятно
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
06.07.2020, 20:07 | 12 |
Не уверен, что MySQL поддерживает кроссбазовые ссылки. Но даже если и поддерживает, то все равно это - анахронизм. Надо либо "переехать" на новую базу, либо масштабировать старую.
Если по сути вопроса. В приложении можно создать произвольное число соединений с произвольным числом баз на произвольном числе SQL-серверов произвольных типов. Важно одно: с каждой базой - отдельный объект connection со своей connectionstring. Взаимодействие с данными в этих соединениях (бд) - Ваша головная боль. Но вот Вам добрый совет: если можно избежать нескольких connection, - избегайте ! Почему Вы проигнорировали тему ORM ? А если все-таки включили ее в проект (в виде EF или каком-другом) , как ее используете ? В Вашем коде это почти не просматривается Добавлено через 3 часа 30 минут Если данные в разных БД, причем одна из них - "родная", т.е. рабочая, на которые у Вас все права. Все остальные - "побочные", из которых Вы берете лишь данные, но не меняете их. Случай достаточно распространенный. Например, если нужная связь с 1С. Схема работы: 1. Создаете ORM (желательно с использованием проверенных инструментов, например EntityFramework), в которой будут Ваши модели + репозиторий. В общем случае получаете: -- Созданные автоматически (EF) классы и контекст в папке .edmx. Туда ручками шаловливыми не лезем ! -- В папке Models создаем ручками классы для дополнительных сущностей. -- В папке Models создаем ручками класс для репозитория. Вообще-то нужен интерфейс, но для новичков сойдет и класс - так проще и понятнее. В этом классе пишем всю имплементацию, которой нет в контексте .edmx. Методы этого репозитория и будете вызывать из контроллера или еще откуда (из других методов репозитория например) 2. В контроллере строите методы, в которых идет обращение к репозиторию для извлечения/модификации моделей. В том числе методы, вызываемые Rasor при построении встроенных разметок. Это к тому, что Вам не нужен "шкаф" для передачи всех данных в одно представление. Вместо этого у Вас будет несколько компактных сумочек, которые надо раздать разным частям одной страницы (представления). Подкачку этих частей лучше выполнить Ajax-ом (это отдельная тема, но там нет ничего сверхсложного, уверяю Вас) 3. Натягиваете стили и пишете js-логику для "оживления" страницы. Стили и js в отдельные файлы (чаще всего в папку Content проекта) Добавлено через 13 минут Чуть не забыл Что делать если баз несколько. Если побочные базы только для извлечения некоторых данных, то просто указываете их (базы) явно в SQL-запросах (или LINQ как Вам удобнее). Соединение у Вас должно быть одно ! Настоятельно рекомендую такие запросы заворачивать в UDF/SP "рабочей" БД - тогда при маппинге EF просто подключите эти программы и получите готовые модели и методы. Если редактировать надо в разных базах. Тут все не так просто. Я бы создал по соединению на каждую БД, при этом количество .edmx у меня было бы равно кол-ву соединений. Изменение данных в этих базах завернул бы в SP, которые написал бы для них. Из репозитория (репозиторий может быть общим - это обычная практика) их бы вызывал, передавая нужные параметры, в соответствующих методах. При этом код работал бы к контексте соответствующего коннекшена. Но, повторюсь, если можно избежать "побочных" баз, это следует сделать в первую очередь ! При работе с несколькими соединениями обязательно следите за транзакциями !
1
|
74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
|
|
07.07.2020, 04:18 [ТС] | 13 |
слов не хватит,чтобы в полной мере вас отблагодарить! СПАСИБО ОГРОМНОЕ!
0
|
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
|
|
07.07.2020, 11:06 | 14 |
Не за что, обращайтесь
Добавлено через 4 минуты Почта: msguns@ukr.net Скайп: Сергей Щербаков, Чернигов
1
|
07.07.2020, 11:06 | |
07.07.2020, 11:06 | |
Помогаю со студенческими работами здесь
14
Как починить тему? Как починить код Как починить усилитель? Как починить код? Как починить Windows XP? Как уго починить??? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |