#silverlight-4.0 #entity-framework-4 #wcf-ria-services
#silverlight-4.0 #entity-framework-4 #wcf-ria-services
Вопрос:
Я использую службы RIA с Silverlight 4 и хотел бы ограничить поля, которые возвращаются из службы. Например:
TableA:
ID
Field1
Field2
Field3
TableB:
ID
TableAID (foreign key)
Field1
RestrictedField2
В моем классе службы домена у меня есть нечто подобное, которое было сгенерировано при создании службы. Я добавил includes (которые работают нормально):
<RequiresAuthentication()>
Public Function GetTableA() As IQueryable(Of TableA)
Return Me.ObjectContext.TableA.Include("TableB")
End Function
Мой вопрос в том, как мне получить все столбцы из TableA, а также получить Field1 из TableB, не возвращая RestrictedField2? Я почти уверен, что это делается с помощью некоторой фантазии Linq, но я не совсем уверен, как.
Спасибо! Мэтт
Обновить
Одно требование, которое я не перечислил выше. Столбец должен быть удален на стороне сервера, поскольку данные в RestrictedField1 не могут иметь никаких шансов быть отправлены клиенту. Кроме того, мне нужно будет использовать это поле в другом методе службы домена (защищенном с помощью RequiresRoleAttribute), чтобы я мог предоставить информацию администратору. Это требование означает, что я не хочу создавать другой сложный тип и возвращать его. Я бы предпочел продолжить работу с типом модели EF.
Комментарии:
1. Я также перепостил этот вопрос на форуме Silverlight и получил ответ, аналогичный моему ответу ниже: forums.silverlight.net/forums/p/227614/551503.aspx#551503
Ответ №1:
Проверьте эту ссылку, я думаю, это может решить вашу проблему без использования модели представления
http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/ab7b251a-ded0-487e-97a9-
Кажется, вы можете вернуть анонимный тип, а затем преобразовать его в нужный вам тип.
Ответ №2:
Основываясь на некоторой информации, которую я нашел, лучший способ выполнить то, что мне нужно, — это создать представление в базе данных и предоставить нужные мне данные через службы EF и RIA. Это, по-видимому, лучшее доступное решение.
Комментарии:
1. Представление — это один из способов, но другим было бы просто создать класс ViewModel, который инкапсулирует данные, которые вы хотите вернуть.
2. @Nissan Fan: Это не решает мою проблему, поскольку ограниченная информация все равно будет передаваться через службу в ViewModel. Любой, у кого есть HTTP-сниффер (Fiddler), мог бы получить доступ к данным, посмотрев на это. Еще лучше, они могли бы просто создать свой собственный клиентский прокси и напрямую вызывать службу. Мне нужно предотвратить сценарии такого типа.
3. На самом деле ViewModel — это определенный вами конкретный класс, который содержит только ту информацию, которая вам нужна. Вы вернете их из метода Invoke или Get в RIA в результате вызова клиента Silverlight.
4. @Nissan Fan: А, понял, я думал, вы размещаете ViewModel на стороне клиента. То, что вы предлагаете, не сильно отличается от изменения «модели» (т. Е. Добавления представления), поэтому я бы счел, что это решение того же типа.
5. Будет достаточно либо View, либо ViewModel; подход ViewModel имеет дополнительное преимущество для вас, поскольку вам не нужно вносить изменения в базу данных ни сейчас, ни в будущем, если требования изменятся.