Entity Framework: ObjectContext.ExecuteStoreQuery создает отдельные объекты - PullRequest
8 голосов
/ 04 февраля 2010

Мне нужно запустить некоторый пользовательский SQL, чтобы вернуть список объектов из таблицы. Для этого я использую ExecuteStoreQuery.

var q = context.ExecuteStoreQuery<ProductionUnit>(MySelectString, new SqlParameter("@ProductionUnitId", value));

Это приводит к тому, что q содержит коллекцию ObjectResult, но фактические элементы ProductionUnit отделены, а их EntityKey равен нулю. Это создает ряд проблем при попытке работать с некоторыми из этих объектов или их отношениями. Мой запрос SQL возвращает набор результатов, содержащий все столбцы соответствующей таблицы ProductionUnits (и ничего более).

Что-нибудь еще, что мне нужно сделать, чтобы отслеживать эти объекты, или это поведение разработано?

Ответы [ 3 ]

3 голосов
/ 04 февраля 2010

Решил сам - вам нужно использовать перегрузку ExecuteStoreQuery, которая позволяет указывать имя EntitySet для возвращаемых объектов.

1 голос
/ 10 марта 2012

Поскольку, кажется, нет принятого ответа с кодом ...

Как говорит @neaorin, чтобы обеспечить отслеживание изменений в возвращаемых объектах, используйте метод

ExecuteStoreQuery <..> (commandText, entitySetName, MergeOptions, args PARAMATERS)

следующим образом:

string strQuery = "SELECT * FROM employees WHERE id=999";
List<employee> employees;
services = context.ExecuteStoreQuery<employee>(strQuery, "employees", System.Data.Objects.MergeOption.AppendOnly).ToList();

Параметр MergeOptions указывает, что делает Framework, если некоторые из этих возвращаемых объектов уже перемещаются в контексте, то есть следует ли их перезаписать или использовать существующие объекты (по умолчанию).

0 голосов
/ 15 марта 2019

В моем случае решением было использовать перегрузку с EntitySet строкой и MergeOption , как упоминалось в предыдущих ответах. Однако ExecuteStoreQuery все еще возвращал элементы сущностей с EntityKey = null и EntityState = Detached.

Причиной этого было то, что строка EntitySet, которую я использовал, была неправильной, я получил правильную строку EntitySet, используя:

var records = _entities.ExecuteStoreQuery<ProductionUnit>(query, typeof(ProductionUnit).Name, System.Data.Entity.Core.Objects.MergeOption.AppendOnly).ToList();

Я получил правильную строку EntitySet, используя typeof(ProductionUnit).Name.

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