RIAServices неподдерживаемые типы на собранном вручную DomainService - PullRequest
1 голос
/ 22 октября 2009

Моя модель EF была сгенерирована из моей базы данных SQL Server. Затем я сгенерировал DomainService для RIAServices на основе модели EF. Одна из сущностей называется "EntryCategories". DomainService создал этот метод:

public IQueryable<EntryCategories> GetEntryCategoriesSet()
{
    return this.Context.EntryCategoriesSet;
}

Поскольку моя модель отображения пользовательского интерфейса сильно отличается от физической модели, я решил написать свой собственный DomainService для этого и связанных объектов. Да, я знаю, что мы должны изменить сгенерированный, но в нем так много всего, и я хотел сосредоточиться на небольшой вещи.

Я удалил атрибут EnableClientAccess из сгенерированного DomainService, добавил новый класс ClientDomainService и инкапсулировал в нем созданный DomainService:

[EnableClientAccess()]
public class ClientDomainService : DomainService
{
    // the generated domain service encapsulated in my new one.
    private DataDomainService _dcds = new DataDomainService(); 

    // reimplement one of the DataDomainService methods
    public IQueryable<EntryCategories> GetEntryCategories()
    {
        return (from t in _dcds.GetEntryCategoriesSet() where t.EntryCategoriesVersions.EntryCategoriesVersionId == datahead.EntryCategoriesVersions.EntryCategoriesVersionId orderby t.DisplayOrder select t);
    }  
}

Самая первая попытка, которую я попробовал, - это переопределить метод GetCateogoriesSet, но с базовыми данными, отфильтрованными по другой сущности в моем классе (не показано). Но когда я это создаю, появляется ошибка:

Entity 'DataProject.Web.EntryCategories' has a property 'EntryCategoriesVersionsReference' with an unsupported type

Если я закомментирую свой CientDomainService, заменим атрибут EnableClientAccess на сгенерированный DomainService и поместим аналоговую фильтрацию linq в исходный метод GetEntryCategoriesSet, проект компилируется без ошибок.

Что такого особенного в сгенерированном DomainService, чего нет у моего нового? Это тот файл metadata.cs?

Ответы [ 4 ]

4 голосов
/ 22 июля 2010

Особенностью сгенерированной доменной службы является не файл .metadata.cs (вы можете сохранить его и использовать, но это не решит вашу проблему).

Проблема возникает как-то потому, что RIAservices (?) нужен «поставщик описания службы домена» для открытых объектов Linq to EF.Класс LinqToEntitiesDomainService имеет уже примененный класс LinqToEntitiesDomainServiceDescriptionProviderAttribute, поэтому сгенерированные доменные службы, которые наследуют его, также наследуют поставщика.

Когда вы создаете свою собственную службу домена, производную от DomainService, и открываете для нее объекты,Нужно применить этот атрибут самостоятельно.Кроме того, поскольку поставщик не может вывести тип контекста объекта из базового класса службы домена (что он может и делает, если базовый класс является LinqToEntitiesDomainService), необходимо указать тип контекста объекта в конструкторе атрибута, например:

[EnableClientAccess()]
[LinqToEntitiesDomainServiceDescriptionProvider(
                            typeof(YourObjectContextType))]
public class ClientDomainService : DomainService
{
    ...
}

Это должно исправить.

Обратите внимание, что это означает, что если вы надеялись абстрагировать свой объектный контекст от вашей доменной службы, вы будете разочарованы.Я выбрал, казалось бы, популярную модель хранилища, в которой весь код, работающий с контекстом объекта, переходит к поставщику, используемому службой домена.Это облегчает модульное тестирование, но, очевидно, не устраняет зависимость доменной службы от контекста объекта.Контекст необходим для того, чтобы службы RIA могли понять ваши объекты или, по крайней мере, те, на которые ссылается сущность домена (например, EntryCategoriesVersions в вашем случае).

0 голосов
/ 30 ноября 2018

Для меня исправлением этой ошибки было добавление конструктора по умолчанию к возвращаемому типу.

В примере OP свойство 'EntryCategories.EntryCategoriesVersionsReference' должно иметь тип с конструктором по умолчанию.

0 голосов
/ 18 августа 2010

Какого типа EntryCategoriesVersionsReference? Попробуйте добавить аннотацию [DataContract] к типу и присвоить [Key] и [DataMember]. Это должно помочь с сортировкой.

0 голосов
/ 03 июля 2010

Если вы хотите представить конкретную сущность в доменной службе, вам придется предоставить по крайней мере один метод запроса для нее. Это также требуется, когда к объекту обращаются только как к дочернему объекту другого объекта.

В этом случае вам нужно добавить набор сущностей EntryCategoriesVersions в службу домена, чтобы сценарий работал правильно.

...