Есть ли способ установить связь с поставщиком услуг OData? - PullRequest
1 голос
/ 03 февраля 2012

Это продолжение проблемы, с которой я все еще сталкиваюсь здесь . Я пытаюсь помешать провайдеру отражения OData предоставить ВСЕ сборки классов CLR в моей сборке.

Рассмотрим следующий класс CLR:

public class Foo
{
    public Guid FooID { get; set; }
    public string FooName { get; set; }
}

И следующий класс для представления Foo в виде IQueryable коллекции:

public class MyEntities 
{ 
    public IQueryable<Foo> Foos 
    { 
        get 
        { 
            return DataManager.GetFoos().AsQueryable<Foo>(); 
        } 
    }
} 

И следующий DataService класс:

public class MyDataService : DataService<MyEntities> 
{ 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
        config.SetEntitySetAccessRule("Foos", EntitySetRights.All); 
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 
    } 
}

Это все работает, кряква, Дори, и DataService может отображать коллекцию Foo. Но если изменить Foo, чтобы расширить очень простой базовый объект, такой как:

public class Foo : MyObjectBase
{
    public Guid FooID { get; set; } 
    public string FooName { get; set; }
}

Затем (даже при том, что я только пытаюсь представить 1 коллекцию), поставщик отражений захватывает ВСЕ объекты, которые расширяют MyObjectBase, вызывая множество ошибок.

Базовый класс - это простой абстрактный класс, который реализует ряд интерфейсов и предоставляет другое свойство, такое как:

public abstract class MyObjectBase: IDataObject, IDataErrorInfo, INotifyPropertyChanged, IDisposable
{
    public virtual Guid ID { get; set; }
}

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

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Вы можете установить:

config.SetEntitySetAccessRule("TypeNotAccessible", EntitySetRights.All); 

в

config.SetEntitySetAccessRule("TypeNotAccessible", EntitySetRights.None);

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

0 голосов
/ 07 февраля 2012

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

Если кто-то предоставит способ дозвониться до провайдера отражения, я приму этот ответ.

...