EF6 можно ли обновить модель / таблицу после лямбда-запросов? - PullRequest
0 голосов
/ 15 апреля 2019

Я являюсь лямбда-запросом моделей (я делаю проекцию с другими классами - GameBankVM, GameCouponBankVM), и в конце я бы хотел зациклить результат запроса и обновить поле модели.Но я получаю Сущность или сложный тип 'EPINMiddleWareAPI.Models.GameBankVM' не могут быть созданы в запросе LINQ to Entities.

Вот мой пример кода:

 var gameBankResult = await (context.GameBanks.Where(g => g.productCode == initiate.productCode)
                .Take(initiate.quantity)
                .Select(g => new GameBankVM
                {
                    quantity = g.quantity,
                    currency = g.currency,
                    initiationResultCode = g.initiationResultCode,
                    productCode = g.productCode,
                    productDescription = g.productDescription,
                    referenceId = g.referenceId,
                    responseDateTime = g.responseDateTime,
                    unitPrice = g.unitPrice,
                    totalPrice = g.totalPrice,
                    coupons = g.coupons.Select(c => new GameCouponBankVM
                    {
                        Pin = c.Pin,
                        Serial = c.Serial,
                        expiryDate = c.expiryDate
                    }).ToList() 
                })).ToListAsync(); 

            if (gameBankResult.Count() != 0)
            {
                foreach (var item in gameBankResult)
                {
                    item.referenceId = initiate.referenceId;
                    context.Entry(item).State = System.Data.Entity.EntityState.Modified;
                }


                await context.SaveChangesAsync();
                return Ok(gameBankResult);
            }

Как я могуобновить ссылку на мою модель / таблицу GameBank?

1 Ответ

0 голосов
/ 15 апреля 2019

В этом сценарии ваши данные не будут обновляться, потому что ваш запрос возвращает Список GameBankVM, а не Список GameBank, теперь, технически говоря, вы нарушаете SRP, вы должны либо обновить свои данные, либо запросить данные не оба в том же методе, вы можете реорганизовать ваш метод следующим образом:

1.- Создайте приватный метод для обновления данных, в этом случае вы напрямую запрашиваете GameBank итерируете записи списка, вносите свои изменения и сохраняете их в базу данных, этот же метод может возвращать список GameBank, чтобы избежать повторного обращения к базе данных. .

2.- В контроллере после вызова нового метода вы можете запустить запрос на преобразование, чтобы преобразовать Список GameBank в Список GameBankVM и вернуть его в представление.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...