2012-01-17 5 views
5

Когда я запускаю моей службы я получил исключение:Сериализация POCO прокси с WCF

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: «Невозможно выполнить сериализацию параметра типа System.Data.Entity.DynamicProxies.Cosik_14C2 ...» (для операции «GetCosik», контракт «ICosikService»), потому что это не точный тип «Project.Domain.Entities.Cosik 'в сигнатуре метода и не находится в коллекции известных типов. Чтобы сериализовать параметр, добавьте тип в коллекцию известных типов для операции, используя ServiceKnownTypeAttribute. '. Подробнее см. Журналы сервера.

Я новичок в службах WCF и Entity Framework, и я был бы признателен за любую помощь/предложения.

Я использую Entity Framework 4.1. Используя код, сначала я создал базу данных с двумя таблицами:

[DataContract(IsReference=true)] 
public class Cosik 
{ 
    [DataMember] 
    public int cosikID { get; set; } 

    [DataMember] 
    public string title { get; set; } 

    [DataMember] 
    public int DifficultyID { get; set; } 
    [DataMember] 
    public virtual Difficulty Difficulty { get; set; } 
} 

[DataContract(IsReference=true)] 
public class Difficulty 
{ 
    [DataMember] 
    public int DifficultyID { get; set; } 

    [DataMember] 
    [Required] 
    public string NameToDisplay { get; set; } 
} 

Затем я создал приложение WCF службы и сделал это RESTful. Ниже код интерфейса:

[ServiceContract] 
public interface ICosikService 
{ 
    [OperationContract] 
    [ApplyDataContractResolver] 
    [WebGet(UriTemplate = "/cosik")] 
    Cosik GetCosik(); 
} 

и реализация этого контракта

public class RecipeService : IRecipeService 
{ 
//repository of Cosik entities - stores collection of all 
//Cosik entities that can be queried from DB 
private ICosikRepository cosikRepo; 
... 

public Cosik GetCosik() 
    { 
     Cosik c = cosikRepo.GetById(1); 
     return c; 
    } 

я реализовал класс ApplyDataContractResolverAttribute дал на: http://msdn.microsoft.com/en-us/library/ee705457.aspx и добавил [ApplyDataContractResolver] аннотацию к методу GetCosik. Однако это не помогло.

Любое предложение, что я пропустил?

+0

Похоже * Cosik * в вашей работе службы GetCosik() и которые вы отметили поскольку контракт с данными не является тем же самым * Cosik *, как определено в вашей модели сущности и которую ваша служба почему-то пытается вернуть. –

+0

Вы по-прежнему получаете ту же ошибку, если отключите ленивую загрузку в своем [ObjectContext] (http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx) с помощью 'context. ContextOptions.LazyLoadingEnabled = false'? –

+0

Можете ли вы добавить [KnownType (Cosik)] над классом RecipeService. – Rajesh

ответ

4

Вместо разработки настраиваемого преобразователя отключите создание прокси. Доверенные не для сценариев, таких как WCF, потому что ленивая загрузка должна быть отключена в любом случае во время сериализации и динамического отслеживания изменений никогда не используется:

context.Configuration.ProxyCreationEnabled = false; 
+0

Отключив создание прокси, все мои виртуальные объекты (поля) становятся нулевыми, и я теряю функциональность, предоставляемую EF. Мне интересно, действительно ли это так, что я должен запросить базу данных для установки виртуальных полей с соответствующими данными самостоятельно. Я просмотрел много страниц, объясняющих, как использовать wcf с простыми примерами для простых данных, но простые данные довольно скудны в реальном мире. Может ли кто-нибудь указать мне на некоторые ресурсы/учебник, в которых объясняется, как использовать wcf для отдыха с EF для более сложных данных? Теперь я использую wcf (без отдыха), и он работает, но я хотел бы узнать, как использовать его в режиме отдыха – anetafr

+0

Ваши виртуальные поля равны нулю, потому что вы не использовали загрузку с нетерпением. Использование ленивой загрузки в ситуациях, когда вы знаете, что вам понадобятся эти данные, неверны, потому что EF должен создать отдельный проход для базы данных для «каждого свойства». –

+0

@anetafr Для лучшей поддержки REST проверьте тип элемента проекта «Служба данных WCF», который можно использовать с кодовым кодом, хотя он имеет свои собственные препятствия (http://blogs.msdn.com/b/writingdata_services /archive/2011/06/15/entity-framework-4-1-code-first-and-wcf-data-services.aspx). Лично я бы выбрал более чистый вариант перевода между объектами и DTO на моем уровне обслуживания. В любом случае, пара других вариантов, о которых вы думаете. – kallotec

Смежные вопросы