Entity Framework 4 - Проблемы с ExecuteFunction <T>FunctionImport, сопоставленной со сложным типом POCO - PullRequest
3 голосов
/ 28 декабря 2010

Я получаю сообщение об ошибке при попытке выполнить FunctionImport - результат сопоставлен с POCO ComplexType - из пользовательского ObjectContext.В частности, состояние ошибки:

Параметр типа BlahComplexType в ExecuteFunction несовместим с типом BlahComplexType, возвращаемым функцией.

Поскольку я используюпользовательский ObjectContext (я работаю с полностью POCO Entity Framework), я должен вызвать FunctionImport вручную, что мне нравится:

var blah = ExecuteFunction<BlahComplexType>("GetBlah", MergeOption.NoTracking,
            new ObjectParameter("p_one", paramOne),
            new ObjectParameter("p_two", paramTwo),
            new ObjectParameter("p_three", string.Empty));

Я не использую никаких шаблонов T4 длягенерировать POCO, все классы пишутся вручную.BlahComplexType - это класс с простыми свойствами типа данных.Его определение совпадает с определением ComplexType в файле .edmx, включая совпадающие пространства имен и все остальное (у меня также есть множество других сущностей и сложных типов, сопоставленных с POCO).

В документации MSDN указано здесь , что возвращаемый тип ExecuteFunction<T> должен реализовывать IEntityWithChangeTracker, но не весь смысл отображения в ComplexType вместо Entity именно потому, что меня не волнуют какие-либо изменения (фактически, измененияне допускаются - BlahComplexType считается «объектом-значением»)?

Кто-нибудь имел счастье вызывать FunctionImport с ExecuteFunction, результаты которого отображаются в POCO ComplexType с Entity Framework 4?

1 Ответ

6 голосов
/ 29 декабря 2010

Ух ты, глупая ошибка пользователя !!

Как всегда при ручном создании классов POCO - это было несоответствие между определением ComplexType в файле EDMX и его классом POCO.Если есть только одна ошибка или несоответствие, то в сообщении об ошибке делается попытка сообщить вам источник проблемы.Тем не менее, если у вас их больше одного, он просто скажет, что типы «несовместимы», так что вы задаетесь вопросом.

В моем случае у меня было несоответствие имени обоих свойств (у одного было "AcctId ", другой имел« Acctid ») и несогласованность данных свойства (класс ожидал int (Int32), но хранимая процедура вернула Int16).

Итак, как всегда, дважды и трижды проверяем определение EDMX и POCOопределение класса.(Я дважды проверил, но пренебрег тройной проверкой !!)

лицевой щиток

...