oData WCF service - скрыть элемент

Я новичок в WCF. В моем веб-проекте есть модель данных сущности ADO.NET (также известная как EF edmx) с именем контейнера сущностей JobSystemEntities.

Я создал простую службу данных oData WCF, которая использует JobSystemEntities, и она отлично работает:

public class JobService : DataService<JobSystemEntities>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("Jobs", EntitySetRights.ReadSingle);
    }

Однако при этом будут показаны все свойства задания. Я хочу скрыть конфиденциальные данные, то есть поле / свойство / столбец «Стоимость» в таблице «Работа».


person Matt Frear    schedule 25.01.2011    source источник
comment
Самым простым было бы просто скрыть этот атрибут в вашей модели EF - например, никогда не использовать / показывать это. Вы могли бы это сделать? Или вы могли бы создать настраиваемую модель EF только для своей службы OData и скрыть этот атрибут от сущности Jobs в этой настраиваемой модели?   -  person marc_s    schedule 25.01.2011
comment
Я использую поле «Стоимость» на веб-сайте, поэтому оно должно быть в модели EF. Ваше предложение создать вторую модель EF для службы oData возможно, но я удивлен, что нет другого способа сделать это?   -  person Matt Frear    schedule 25.01.2011


Ответы (2)


Я публикую это, но поздно, но это может помочь другим.

Вы можете использовать атрибут IgnoreProperties http://msdn.microsoft.com/en-us/library/system.data.services.ignorepropertiesattribute.aspx в вашем классе.

Для этого вам нужно будет определить частичный класс Job. Что-то в строках:

namespace DAL.Entities
{
    [IgnoreProperties("Cost")]
    public partial class Job
    {

    }
}
person Magnus Kragelund    schedule 09.03.2011
comment
Я не думаю, что это работает с Entity Framework в качестве вашего уровня данных. Если у вас есть что-то еще, то все должно работать нормально. - person Vaccano; 26.07.2011
comment
Недавно я сам использовал его в проекте, он отлично работал с Entity Framework. - person Magnus Kragelund; 04.08.2011
comment
Когда у меня это не сработало, я задал следующий вопрос: stackoverflow.com/questions/6600037/ Результатом стало то, что это не работает для шаблона POCO. (Возможно, это работает для обычного EF.) - person Vaccano; 05.08.2011

Я сделал нечто подобное. Здесь можно найти хорошую отправную точку:

http://weblogs.asp.net/rajbk/archive/2010/05/15/pre-filtering-and-shaping-odata-feeds-using-wcf-data-services-and-the-entity-framework-part-1.aspx

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

[QueryInterceptor("YourObjectsProtectedProperties")]
public Expression<Func<YourObjectsProtectedProperties, bool>> OnReadYourObjectsProtectedProperties()
{
if (ShowEntityToUser())
   return o => true == true;
return o => true == false;
}
person George    schedule 14.02.2012