2011-01-25 3 views
2

Я новичок в WCF. Мой веб-проект имеет ADO.NET Entity Data Model (aka EF edmx), который имеет имя контейнера сущностей JobSystemEntities.oData WCF сервис - скрыть элемент

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

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

Однако, это выставляет все свойства на Иова. Я хотел бы скрыть конфиденциальные данные, т. Е. Поле «затраты»/свойство/столбец таблицы «Job».

+0

Проще всего было бы просто скрыть этот атрибут в вашей модели EF - например. никогда не используйте/не показывайте это. Не могли бы вы сделать это? Или вы можете создать пользовательскую EF-модель только для своей OData-службы и скрыть этот атрибут от объекта «Jobs» в этой пользовательской модели? –

+0

Я использую поле «Стоимость» на веб-сайте, поэтому оно должно быть в модели EF. Возможно ваше предложение создать вторую EF-модель для службы oData, но я удивлен, что нет другого способа сделать это? –

ответ

2

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

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

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

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

    } 
} 
+0

Я не думаю, что это работает с Entity Framework как ваш уровень данных. Если у вас есть что-то другое, тогда он должен работать нормально. – Vaccano

+0

Я использовал его сам в проекте недавно, он отлично работал с Entity Framework. –

+1

Когда это не сработало для меня, я задал этот вопрос: http://stackoverflow.com/questions/6600037/add-ignoredamamemeber-to-specific-properties-in-a-generated-partial-class. Результат состоял в том, что он не работает для шаблона POCO. (Может быть, это работает для нормального EF, хотя.) – Vaccano

0

Я сделал что-то похожее на это. Хорошая отправная точка находится здесь:

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; 
}