RuiBarreiros Ответов: 1

Как сохранить изменения в базе данных из анонимного запроса LINQ?


Привет,
Я пытаюсь создать приложение WPF с entity framework (используя MVVM) для взаимодействия с существующей базой данных.
Я столкнулся со следующей проблемой:
1.мне нужно создать запрос LINQ, чтобы вернуть несколько столбцов из разных таблиц. Я понял, что запрос LINQ как таковой вернет анонимный тип, который я, похоже, не могу преобразовать в ObservableCollection.
2. одним из решений этой проблемы было бы создание класса с теми же свойствами, что и столбцы, которые я хочу получить, а затем передать мой запрос LINQ новому экземпляру этого класса, решив таким образом анонимную проблему и позволив мне создать ObservableCollection результата.

Проблема в том, что, поскольку этот класс, который я создал, не принадлежит DBContext, я не знаю, как сохранить изменения обратно в мою базу данных.

Мне нужно некоторое руководство о том, как действовать при запросе разных столбцов в разных таблицах.

Заранее спасибо.

Что я уже пробовал:

Создать класс, содержащий свойства, которые сопоставляются столбцы из запроса LINQ

1 Ответов

Рейтинг:
5

F-ES Sitecore

При сохранении изменений обратно просто делайте их на отдельных классах. Поэтому, если у вас есть две объединенные таблицы, запрос вернет родительский объект и дочерний объект, и вы просто обновите свойства этих классов, так что если это заказы и строки заказов;

var order = YourQueryToGetTheOrderData;
order.Status = "Complete";
order.OrderLine[0].LastUpdated = DateTime.Now;
// now save your database context and both Order and OrderLine will be updated


RuiBarreiros

Но можно ли создать анонимный запрос типа LINQ? Поскольку я использую шаблон MVVM, я узнал, что должен привязываться к ObservableCollections, но я не могу создать ObservableColletion из анонимного запроса LINQ. Так что же мне делать?

F-ES Sitecore

Существуют обходные пути для создания oberveablecollection из anon типов, таких как http://stackoverflow.com/questions/2344188/c-sharp-convert-anonymous-type-to-observablecollection Однако, как правило, если данные покидают функцию, которая их создает, или потребляются в другом месте, то вам следует избегать анонимных типов.

RuiBarreiros

Спасибо! Итак,если в моей БД есть таблица Orders и таблица Customer и я хочу получить свойства как из таблиц Orders, так и из таблиц Customers, я бы создал класс OrderInfo с нужными мне свойствами, а затем создал бы экземпляр этого класса в результате запроса LINQ, чтобы создать ObservableCollection.
Это правильно? Как бы я тогда обновил базу данных в этой ситуации? Класс OrderInfo не принадлежит DBContext, в котором находятся классы Orders и Customers...Извините, если это сбивает с толку, но все это для меня ново...

F-ES Sitecore

Если вы не можете получить ваши коллекции ObservableCollection работает от клиента класса и необходимость создания OrderInfo класса, затем, когда вы приходите, чтобы обновить данные в OrderInfo вам необходимо повторно получить соответствующие сведения от ВФ, так что вы получите соответствующие поддержки и того, и обновить эти объекты, а затем сохранить контекст. Это не эффективно, так как это означает, что вы не можете просто обновить, вы должны выбрать и затем обновить, но это EF для вас.

RuiBarreiros

Ладно, понял! Спасибо! Однако еще один вопрос: было бы более эффективно, если бы я создал представление в SQL (например, используя SMSS), а затем добавил Это представление в свой EF, чтобы я мог непосредственно обновить DBContext? Сработает ли это?

F-ES Sitecore

TBH "правильная" вещь - это использовать пользовательскую сущность, которая включает клиента и заказ в один класс. Из коробки EF работает, создавая сущность из таблицы, но это именно то, что вы получаете, когда перетаскиваете ее. Вы можете создавать свои собственные сущности, поэтому вы можете определить CustomerOrder как сущность, которая имеет определенные поля от Customer и определенные поля от Order. Ваши запросы вернут этот объект из select, и позже вы сможете прикрепить его к контексту, чтобы обновить. Вам, вероятно, придется покопаться в некоторых статьях MSDN, чтобы узнать больше информации об этом, прошло уже некоторое время с тех пор, как я сам смотрел на это.

RuiBarreiros

Отлично! Большое спасибо! Это должно указать мне верное направление! Почет