Расширение свойства Entity Framework - PullRequest
0 голосов
/ 19 марта 2012

У меня есть объект с именем File, я создал частичный класс со свойством.

Мне удалось использовать это свойство в обычных конструкторах и других выражениях. Но это свойство не принимается ни в одном операторе linq.

Я получаю следующее исключение.

Исключение

Указанный тип члена FileStatus не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей.

Код

var fileEntry = from entry in context.ICFiles
                             where entry.FileName == FileName &&
                                   entry.FileStatus == FileStatus.InProgress
                             select entry;

fileEntry.First().FileStatus = FileStatus.Completed; 
// This is where I get the exception

Определение свойства

public partial class ICFile
{
    [DataMemberAttribute()]
    public FileStatus FileStatus
    {
        get
        {
            return (FileStatus)this.Status;
        }
        set
        {
            this.Status = (int)value;
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 19 марта 2012

Я думаю, что проблема заключается в том, что платформа сущностей пытается преобразовать ваше свойство FileStatus в столбец в базе данных, где он не существует, и для него нет информации о сопоставлении, которую можно использовать, как вы определили его в частичнойучебный класс.

Я вижу, что вы пытаетесь привести к перечислению, потому что, вероятно, вы используете версию Entity Framework до бета-версии 5, которая, очевидно, имеет поддержку enum (возможно, я ошибаюсь, возможно, она все еще отсутствует).

К сожалению, перечисления не очень хорошо работают в текущей версии Entity Framework (4.3.1).Существуют различные варианты, которые вы можете сделать, но ни один из них не очень удовлетворителен, и вам часто приходится случайно загружать всю таблицу в память или что-то столь же ужасное (см. Использование ADO.net Entity Framework 4 с перечислениями? Как это сделать?).

Лично я бы просто не стал беспокоиться о частичном классе и сделал бы ваш запрос так, чтобы все было просто:

var fileEntry = from entry in context.ICFiles
                         where entry.FileName == FileName &&
                               entry.Status == (int)FileStatus.InProgress
                         select entry;

fileEntry.First().Status = (int)FileStatus.Completed; 

Не идеально, но это работает, и это показывает, что происходит ивы знаете, что предложение where будет правильно переведено в эквивалентный бит SQL для работы с базой данных (я думаю, это называется "прагматичным").

0 голосов
/ 22 марта 2012

Право, когда я задал вопрос, у меня остался ответ, который отправил @ user1039947. Однако это не тот ответ, который я ожидал получить в ответ на этот вопрос.

Я искал способность Entity Framework полностью использовать Enum. Но в конце концов я понял, что Linq to Entity не может распознать Enums (обычно он распознает сущности через атрибут, начинающийся с Edm, такой как EdmTypeAttribute, EntityPropertyAttribute и т. Д.)

Линк к Entity из Framework 4.0, не имеет возможности принять перечисления в качестве объекта сущности. Однако частичный метод дает нам 80% того, что нам может понадобиться от enum.

Я разместил блог с более подробной информацией об этом.

0 голосов
/ 19 марта 2012

Я не думаю, что использование Enums в вашем примере кода вызывает какие-либо проблемы. Проблема заключается просто в том, что ваше свойство расширения класса не распознается EF как член ICFiles, поскольку его нет ни в вашей модели edmx, ни в столбце таблицы базы данных. Используйте пример кода, который user1039947 дал вам, и с вами все будет в порядке.

Однако вы можете использовать свой исходный запрос при выполнении поиска LINQ to Object в экземпляре ICFiles IEnumerable. Это связано с тем, что LINQ to Entities преобразуется в SQL перед извлечением данных из базы данных, а LINQ для объектов выполняется в памяти. Ваше свойство FileStatus не существует в вашей базе данных, только в памяти.

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