Что я должен знать о работе с ADO.Net Data Services? (ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ) - PullRequest
4 голосов
/ 06 октября 2009

Я учился, используя ADO.Net Data Services (Astoria) в течение последних нескольких месяцев, и, хотя мне нравится технология, обучение было настоящим испытанием. Информация, необходимая для их эффективного использования, распространяется на документацию MSDN, статьи, посты в блогах, форумы поддержки и, конечно, StackOverflow. Этот вопрос - место для меня, чтобы поделиться некоторыми из моих с трудом завоеванных результатов, чтобы кто-то еще мог извлечь выгоду. Я также надеюсь, что другие люди поделятся своими лучшими практиками и ответами на часто задаваемые вопросы, и исправят мои недоразумения!

Для полного раскрытия, я использовал фреймворк с Linq to SQL, чтобы сделать мою жизнь более сложной, поэтому я надеюсь, что подробности в моих ответах подходят и для Entity Framework.

Для начала ниже приведены некоторые ссылки, которые я нашел необходимыми. Затем я добавлю биты по конкретным темам в раздел ответов.

Полезные ссылки

Ответы [ 3 ]

2 голосов
/ 06 октября 2009

Сервисные операции

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

Они позволяют добавлять методы к вашему сервису, но с некоторыми ограничениями:

  1. Вы можете использовать только базовые типы или типы объектов (т. Е. Типы, уже предоставленные службой).
  2. Параметры метода могут быть только простыми типами, которые могут быть выражены как часть URL.
  3. datasvcutil не генерирует код для Service Operations, поэтому вам нужно добавить их в клиентские библиотеки самостоятельно.
  4. Если вы возвращаете тип сущности, но вам не нужно ничего возвращать, т. Е. Результат равен нулю, то в качестве ответа HTTP вы получите 404.
  5. Если вы вернете void, вы не сможете использовать контекст данных клиента для выполнения запроса, вам придется использовать WebRequest.

Примеры (хорошо, они упрощены, поэтому на самом деле не нужно использовать Service Operations):

[WebGet]
public Product GetProductByID(int productID)
{
    return this.CurrentDataSource.Products.First(p => p.ID == productID);
}

[WebGet]
public IEnumerable<Product> GetCancelledProducts(int productID)
{
    return this.CurrentDataSource.Products.Where(p.Cancelled);
}
1 голос
/ 06 октября 2009

Работа с Linq to SQL

Вы можете использовать Linq to SQL в качестве контекста данных только для чтения для Data Services прямо из коробки:

public class MyService : DataService<MyLinqToSqlDataContext>

Однако, чтобы получить поддержку обновления / записи, вам потребуется реализация IUpdateable для Linq to SQL. К счастью, у Эндрю Конрада есть один для вас в галерее кодов MSDN:

Реализация IUpdateable для служб данных ADO.Net для Linq to Sql

Отбросьте это как частичный класс для вашего контекста данных, и вы готовы писать и читать. Обратите внимание, что у этой реализации есть несколько незначительных проблем, подробно описанных на сайте, и что иногда использование Data Services с Entity Framework, как было задумано, выглядит немного более плавно.

Проверка обновлений

При сохранении изменений вы увидите, что Linq to Sql генерирует предложение WHERE, которое проверяет существующие значения в полях, что не всегда то, что вы хотите. Это на самом деле совет Linq to Sql, а не специфический для Data Services, но это единственное место, где я использую Linq для Sql Чтобы остановить это, зайдите в конструктор Linq to Sql и выберите поля, которые вы не хотите проверять. Измените свойство UpdateCheck на Never или OnlyWhenChanged.

1 голос
/ 06 октября 2009

Клиентская библиотека Silverlight

LINQ Querying

Сначала кажется, что синтаксис linq не может быть использован из вашего контекста, потому что все запросы асинхронные и IEnumerable, очевидно, не имеет метода BeginExecute. Чтобы использовать синтаксис Linq, вам нужно привести ваш возможный запрос:

var query = (DataServiceQuery<Product>)myContext.Products.Where(p => p.SupplierID == 5);
query.BeginExecute(this.HandleQueryResults, query);

Обратите внимание, что запрос передан, потому что вам нужно использовать один и тот же экземпляр DataServiceQuery для вызова EndExecute, вы не можете просто использовать контекст.

Отслеживание изменений

Клиентская библиотека не отслеживает изменения полей автоматически в сгенерированных типах. Чтобы это работало, вы должны реализовать INotifyPropertyChanged в ваших частичных типах.

Пример:

public partial class Product : INotifyPropertyChanged {

    public event PropertyChangedEventHandler PropertyChanged;

    partial void OnProductIDChanged() { FirePropertyChanged("ProductID"); }
    partial void OnProductNameChanged() { FirePropertyChanged("ProductName"); }

    private void FirePropertyChanged(string property) { ... }
}

В версии 1.5 инструменты Data Services могут сгенерировать это для вас, но в настоящее время это только в CTP: Введение в привязку данных в Silverlight 3 с 1,5 CTP2

Обновленные данные сервера

По умолчанию в контексте клиента Silverlight MergeOption установлено значение AppendOnly. Это означает, что вы не увидите никаких изменений в сущностях после первого запроса к ним, это форма кеширования и оптимизации производительности. Чтобы увидеть обновления, вам нужно изменить MergeOption на OverwriteChanges, это обеспечит обновление объектов. Вы также можете выбросить свой контекст и заново создать.

myContext.MergeOption = MergeOption.OverwriteChanges

Междоменный доступ

Сгенерированные типы Silverlight для ADO.NET Data Services 1 используют свой собственный сетевой стек, чтобы сделать доступным больше глаголов запросов, но, к сожалению, это означает, что междоменные политики не применяются, и вы не можете делать междоменные запросы. Чтобы обойти это, вы можете прокси-запросы или подождать версии 1.5 (CTP 2 в настоящее время доступна), которая поддерживает кросс-домены в Silverlight 3.

Ссылки:

...