Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
1

Сломался метод Create, как починить?

23.06.2020, 09:16. Показов 5319. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые знатоки, к вам очень интересный вопрос: как могло сломаться то, что целую неделю не трогали?

Создала метод 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
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2020, 09:16
Ответы с готовыми решениями:

Сломался ноутбук MSI GX 640 как починить без СЦ
проблема такая,у меня ноутбук msi gx 640 сток на нем сломался корпус а именно(крепление крышки...

Возможно ли реализовать через bitmap метод BitmapSource.Create WPF-ный?
Друзья, суть такая - есть массив данных , мне нужно получить из него картинку 32 на 32, на каждый...

Как починить?
Помогите пожалуйста проблемы с зарядкой ноутбука. Как починить? Нашла инфу на сайте del] ,...

Как починить wi-fi на ноутбуке НР?
Нечаянно залила на ноутбуке клавиатуру, сначала вообще весь ноутбук не работал, через несколько...

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

не пытаетесь ли Вы вручную определить значение id перед вставкой, а потом совать его в запрос (модель) ?
Ну что типа Select max(id)+1 from table ?
Изначально нет, но когда увидела, что временные значения трех переменных совпадают, то чтобы проверить, прописала
C#
1
var lastId = _context.Apartments.Last();
0
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
30.06.2020, 02:21 4
Цитата Сообщение от Talinka Посмотреть сообщение
Изначально нет, но когда увидела, что временные значения трех переменных совпадают
И Вы полагаете, что найдется супертелепат, который поймет, что это за "переменные" и каким боком они связаны с айдишником какой-то таблицы ?

Ясно одно, что Ваши потуги "вычислить" значение нового id - это закат солнца вручную.
Короче, 1-й класс, вторая четверть.
0
74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
30.06.2020, 04:29  [ТС] 5
переменные IdContract, IdApartment и IdHistoryStatus

три разные таблицы, главная Contracts с уникальным идом, с таблицей Apartments связана внешним ключом, как и с ContractStatusHistory.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
 public IActionResult Create()
        {
            var spDelegates = _context.SpDelegate.ToList();
            var SpSigners = _context.SpSigner.ToList();
            var SpApartmentTypes = _context.SpApartmentType.ToList();
            var SpProcessStatus = _context.SpProcessStatus.ToList();
            var spEvaluators = _context.SpEvaluator.ToList();
            var ViewModelCreate = new IndexViewModel()
            {
                SpDelegates = spDelegates,
                SpSigners = SpSigners,
                SpApartmentTypes = SpApartmentTypes,
                SpProcessStatuses = SpProcessStatus,
                SpEvaluators = spEvaluators
            };
 
            return View(ViewModelCreate);
        }
 
        // POST: Contracts/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(IndexViewModel indexView)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    Apartments apr1 = new Apartments
                    {
                        IdApartmentType = indexView.Contracts.ApartmentSide1.SpApartmentType.IdApartmentType,
                        House = indexView.Contracts.ApartmentSide1.House,
                        Flat = indexView.Contracts.ApartmentSide1.Flat,
                        Room = indexView.Contracts.ApartmentSide1.Room,
                        Part = indexView.Contracts.ApartmentSide1.Part,
                        Index = indexView.Contracts.ApartmentSide1.Index,
                        TotalArea = indexView.Contracts.ApartmentSide1.TotalArea,
                        InventoryNumber = indexView.Contracts.ApartmentSide1.InventoryNumber
                    };
                    
                    var lastId = _context.Apartments.Last();
 
                    apr1.IdApartment = lastId.IdApartment+1;
 
                    _context.Apartments.Add(apr1);
                   
                    Apartments apr2 = new Apartments
                    {
                        IdApartmentType = indexView.Contracts.ApartmentSide2.SpApartmentType.IdApartmentType,
                        House = indexView.Contracts.ApartmentSide2.House,
                        Flat = indexView.Contracts.ApartmentSide2.Flat,
                        Room = indexView.Contracts.ApartmentSide2.Room,
                        Part = indexView.Contracts.ApartmentSide2.Part,
                        Index = indexView.Contracts.ApartmentSide2.Index,
                        TotalArea = indexView.Contracts.ApartmentSide2.TotalArea,
                        InventoryNumber = indexView.Contracts.ApartmentSide2.InventoryNumber,
                        CadastralPrice = indexView.Contracts.ApartmentSide2.CadastralPrice
                    };
 
                    ApartmentEvaluations ApEv1 = new ApartmentEvaluations
                    {
                        IdApartment = apr1.IdApartment,
                        EvaluationDate = indexView.Contracts.ApartmentSide1.ApartmentEvaluations.EvaluationDate,
                        EvaluationNumber = indexView.Contracts.ApartmentSide1.ApartmentEvaluations.EvaluationNumber,
                        EvaluationPrice = indexView.Contracts.ApartmentSide1.ApartmentEvaluations.EvaluationPrice,
                        IdEvaluator = indexView.Contracts.ApartmentSide1.ApartmentEvaluations.SpEvaluator.IdEvaluator
                    };
 
                    apr2.IdApartment = apr1.IdApartment + 1;
                    _context.Apartments.Add(apr1);
 
                    ContractStatusHistory statusHistory = new ContractStatusHistory
                    {
                        IdProcessStatus = indexView.Contracts.ContractStatusHistory.SpProcessStatus.IdProcessStatus
                    };
                   
                    Contracts ctr = new Contracts
                    {
                        IdContract = 0,
                        OrderNumber = indexView.Contracts.OrderNumber,
                        ContractRegistrationDate = indexView.Contracts.ContractRegistrationDate,
                        FilingDate = indexView.Contracts.FilingDate,
                        OrderDate = indexView.Contracts.OrderDate,
                        IdDelegate = indexView.Contracts.SpDelegate.IdDelegate,
                        IdExecutor = indexView.Contracts.SpSigner.IdSigner,
                        ApartmentSide1 = apr1,
                        ApartmentSide2 = apr2,
                        ContractStatusHistory = statusHistory
                    };
                    _context.Contracts.Add(ctr);
                    
                        _context.SaveChanges();
                    return RedirectToAction(nameof(Index));
                }
            }
            catch (DbUpdateConcurrencyException)
            {
                ModelState.AddModelError("", "Unable to save changes." +
                    " Try again, and if the problem persists see your system administrator.");
            }
 
            return View(indexView);
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class IndexViewModel
    {
        public Contracts Contracts { get; set; }
        public Apartments Apartments { get; set; }
        public List<SpDelegate> SpDelegates { get; set; }
        public List<SpProcessStatus> SpProcessStatuses { get; set; }
        public List<ContractStatusHistory> ContractStatusHistories { get; set; }
        public List<SpSigner> SpSigners { get; set; }
        public List<SpApartmentType> SpApartmentTypes { get; set; }
        public List<SpEvaluator> SpEvaluators { get; set; }
        
    }
Вообще, подобную работу делаю впервые, поэтому и задаю столь глупые вопросы, потому что новичок.
Благодарствую за ответы и потраченное время.
0
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
02.07.2020, 01:24 6
C#
1
2
3
4
5
 var lastId = _context.Apartments.Last();
 
                    apr1.IdApartment = lastId.IdApartment+1;
 
                    _context.Apartments.Add(apr1);
Фтопку ! Дальше даже не стал смотреть, ибо болтающемуся в петле зубы не лечат

Добавлено через 10 минут
Цитата Сообщение от Talinka Посмотреть сообщение
Вообще, подобную работу делаю впервые
Оно и видно. В контроллер суете логику работы с моделью - а это бандитизм (с)
И что это еще за "чудище обло, озорно, стозевно и лайяй" (с) ? Имеется в виду модель IndexViewModel.
Это типа контейнера, куда Вы пытаетесь засунуть все, что можно, включая старые тапочки, дедушкин футляр от очков и вообще все, что лежит на чердаке и подвале ?

Почитайте что-нибудь про базы данных. Ну ведь полно материала. На том же метаните, профессорвебе и т.д.

ЗЫ. Зачем у вас Async ? Это осмысленно или потому что "дядя" сказал/написал/показал ?
1
74 / 6 / 0
Регистрация: 24.01.2020
Сообщений: 159
02.07.2020, 07:52  [ТС] 7
ЗЫ. Зачем у вас Async ? Это осмысленно или потому что "дядя" сказал/написал/показал ?
Этот момент я еще не исправила, это создано автоматически, однако при попытке убрать, все тоже ломалось.
Цитата Сообщение от MsGuns Посмотреть сообщение
Имеется в виду модель IndexViewModel
Там далеко не всё, а лишь самое необходимое

Цитата Сообщение от MsGuns Посмотреть сообщение
Фтопку ! Дальше даже не стал смотреть, ибо болтающемуся в петле зубы не лечат
Ну так я и сама понимаю, что это крайне чудовищно, однако другого способа не нашла. Повторюсь, что неделю не трогала метод, он прекрасно работал без этого извращения, а потом что-то пошло по одну месту...

Добавлено через 1 минуту
Цитата Сообщение от MsGuns Посмотреть сообщение
В контроллер суете логику работы с моделью - а это бандитизм (с)
других примеров к сожалению не нашла
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
Цитата Сообщение от MsGuns Посмотреть сообщение
база уже есть и в ней реальные данные, то DataBase First однозначно.
База есть , такой подход я использовала применив Scaffold-DbContext, а результате которого получила папку с набором всех таблиц бд, но так как их очень много создала ViewModel с наиболее важными Также автоматически создала CRUD операции и их уже редактировала под себя, минус в том, что на всех сайтах, которые я находила логика была прописана в контроллере, поэтому решила делать также, учитывая уровень знаний в данной теме...
Спасибо вам за столь большой ответ, он очень полезен!

Добавлено через 1 минуту
Цитата Сообщение от MsGuns Посмотреть сообщение
также класс Репозиторий, включающий методы работы с классами-сущностями
буду пытаться поменять свой кошмар((
0
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
03.07.2020, 13:24 10
Лучший ответ Сообщение было отмечено Talinka как решение

Решение

Цитата Сообщение от Talinka Посмотреть сообщение
База есть , такой подход я использовала применив Scaffold-DbContext, а результате которого получила папку с набором всех таблиц бд, но так как их очень много создала ViewModel с наиболее важными Также автоматически создала CRUD операции и их уже редактировала под себя, минус в том, что на всех сайтах, которые я находила логика была прописана в контроллере, поэтому решила делать также, учитывая уровень знаний в данной теме..
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 улицы, а в другой полная расшифровка
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=***;Port=***;Database=test1;User Id=***Password=******;"
 
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}
 
 
 string connection = Configuration.GetConnectionString("DefaultConnection"); ;
            services.AddDbContext<mena_testContext>(options => options.UseMySQL(connection));
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
Видела вариант, что пишут допустим :
"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
Цитата Сообщение от Talinka Посмотреть сообщение
А у меня возник еще один вопрос, вы случаем не подскажите как сделать двойное подключение? Просто в одной базе существуют про Id улицы, а в другой полная расшифровка
Не уверен, что 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
Цитата Сообщение от Talinka Посмотреть сообщение
слов не хватит,чтобы в полной мере вас отблагодарить! СПАСИБО ОГРОМНОЕ!
Не за что, обращайтесь

Добавлено через 4 минуты
Почта: msguns@ukr.net
Скайп: Сергей Щербаков, Чернигов
1
07.07.2020, 11:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2020, 11:06
Помогаю со студенческими работами здесь

Как починить тему?
При установке темы ругается: &quot;Не найден style.css&quot; Создаю &quot;пустой&quot; style.css и тогда ругается так:...

Как починить код
d = e = line = a = input(&quot;Введите ФИО: &quot;) b = input(&quot;Введите Возраст: &quot;) c = input(&quot;Введите...

Как починить усилитель?
Как починить усилитель? видимых повреждений на плате нет. проблема состоит в том что он просто не...

Как починить код?
uses GraphABC, ABCButtons, System.Windows.Forms; procedure play(); begin window.Clear; end;...

Как починить Windows XP?
Не удается запустить Windows ХР из-за испорченного или отсутствующего файла...

Как уго починить???
Вставил новую видеокарту. комп включился с искаженным изображением.установил драйвера....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru