Как выполнить проверку в Silverlight/RIA, когда требуется обращение к базе данных?

Я чувствую, что есть лучший способ сделать это, чем то, что я делаю сейчас.

Я использую Silverlight 4, RIA и EF (с адаптером Oracle). Я вставляю запись в таблицу и много проверяю ее с помощью атрибутов проверки, но у меня есть одна часть проверки, которая требует запроса к БД для проверки существующих записей, прежде чем можно будет вставить новую (похоже, это должно быть обычное и простое требование, нет?)

Прямо сейчас я делаю это на стороне клиента с помощью метода Invoke в DomainService. Это кажется хромым и глупым. Но я не могу понять, как сделать это на стороне сервера там, где ему действительно место.

Кажется, что должен быть способ обрабатывать все это на стороне сервера и информировать клиента об ошибке проверки, но я не могу понять это, и вряд ли кто-то подходит к этому конкретному сценарию проверки.


person Chris Holmes    schedule 28.02.2011    source источник
comment
Привет, у вас должен быть мост между пользовательским интерфейсом SL и бизнес-логикой, либо WCF через асинхронный запуск события и обработку его завершенного метода, либо с помощью RIA Services, которые прекрасно все это обертывают для вас. Вся логика взаимодействия с базой данных и запрос/обновление должны находиться на бизнес-уровне, чем вы можете себе представить, что пользовательский интерфейс получает значение true или false в завершенном методе, если все прошло нормально или не удалось.   -  person Davide Piras    schedule 01.03.2011
comment
У вас есть пример Давиде? Потому что это довольно расплывчатый ответ. Я работаю лучше, видя реальный код, понимаете?   -  person Chris Holmes    schedule 01.03.2011


Ответы (2)


WCF RIA предоставляет средства для присоединения проверки к сущностям на стороне сервера. Вы создаете класс, как описано ниже, назвав его Rules.

public static partial class FooRules
{
  public static ValidationResult FooIDUnique(Foo foo, ValidationContext context)
  {
    bool check = false;

    using (FooEntities fe = new FooEntities())
    { 
      check = fe.Foo.Any(f => f.FooId == foo.fooId); 
    }
    if (!check)
      return ValidationResult.Success;

    return new ValidationResult("FooID error msg,", new string[] { "FooID" });
  }
}

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

Вы можете скачать его здесь.

person Rus    schedule 28.02.2011
comment
Это не скомпилирует Rus. Как только я пытаюсь использовать FooEntities (конечно, имя изменено правильно), он взрывается при компиляции. Говорит мне, что мне не хватает пространства имен, но это не имеет никакого смысла... - person Chris Holmes; 01.03.2011
comment
Все ваши классы правил на стороне клиента или сервера должны находиться в пространстве имен .Web (на стороне сервера) независимо от того, находятся ли они физически в проектах на стороне клиента или сервера. Кроме этого, вставьте сюда ошибку компиляции, и я постараюсь помочь. - person Rus; 01.03.2011
comment
Имя типа или пространства имен «FooEntities» не может быть найдено (вам не хватает директивы using или ссылки на сборку?). Как только я пытаюсь создать FooEntities в этом частичном классе, это бомбит. Я могу выполнить любую проверку свойства/сущности, которую захочу, с помощью тех методов статической проверки (хранящихся на стороне сервера), но как только я попытаюсь включить контекст Entities, никаких костей. - person Chris Holmes; 01.03.2011
comment
Крис, я сделал маленькое приложение, чтобы объяснять вещи. Надеюсь, это полезно. URL-адрес для него находится в ответе выше. - person Rus; 01.03.2011
comment
Очень странно. Я не мог заставить его работать, несмотря ни на что. Затем мой компьютер взорвался, я перезагрузился, и это сработало... Думаю, Microsoft Voodoo Magic снова в действии. Спасибо за помощь. - person Chris Holmes; 01.03.2011

Я не знаю, как дать ссылку на конкретную запись, но проверьте эту тему....

http://forums.silverlight.net/forums/p/212555/502113.aspx

person BenCr    schedule 01.03.2011