Статьи

CRUD-операции в Silverlight с использованием ADO.NET Data Service (Astoria)

Вступление

В этой статье описан простейший способ выполнения операций CRUD (создание, получение, обновление, удаление) в Silverlight с использованием службы данных ADO.NET (Astoria). Существует два способа связи с базой данных в Silverlight.
1) Веб-сервис 2) ADO.NET Data Service. Я выбрал ADO.NET Data Service для этой статьи, потому что RESTful Service и RIA (Rich Internet Application) лучше всего подходят для разработки. Если вы не знаете, что такое ADO.NET, прочитайте мой предыдущий пост здесь .

Загрузить пример: CRUDSilverlight.zip

содержание

  • Предпосылки
  • Создание базы данных в SQL 2005
  • Создание службы данных ADO.NET в Visual Studio 2008
  • Создание Astoria Proxy для проекта Silverlight
  • Вставка новой записи в Silverlight
  • Обновление существующей записи в Silverlight
  • Извлечение записи из базы данных в Silverlight
  • Удаление записи в Silverlight
  • Вывод
  • Вопросы и ответы

Предпосылки

Создание базы данных в SQL 2005

Примечание. Если вы уже знаете, как создать базу данных в SQL 2005, перейдите к следующему разделу.

Шаг 1. Откройте SQL Server Management Studio Express.

Шаг 2. Подключитесь к SQL Server, установленному на локальном компьютере.

Шаг 3: Щелкните правой кнопкой мыши узел базы данных в обозревателе объектов и выберите «Новая база данных»

Шаг 4: Введите имя вашей базы данных (я назвал его «MyStore» в этом примере) и нажмите кнопку «ОК»

Шаг 5: Щелкните правой кнопкой мыши узел таблицы созданной вами базы данных и выберите «Новая таблица».

Шаг 5. Создайте два столбца с именами «ProductID (INT Identity PK)» и «ProductName». Назовите таблицу «Продукты»

Ладно. Это все о создании новой таблицы в SQL 2005.

Создание службы данных ADO.NET в Visual Studio 2008

Примечание. Я уже объяснял, как создать службу данных ADO.NET, в моей предыдущей статье « Использование службы данных ADO.NET (Astoria) из Silverlight ». (В этом примере я буду использовать веб-приложение ASP.NET 3.5 Extensions.) Если вы уже читали этот пост, пропустите этот раздел.

Шаг 1. Создайте новое веб-приложение ASP.NET 3.5 Extensions

  • Нажмите значок «Новый проект» или нажмите «Ctrl + Shift + N».
  • Выберите «Веб-приложение ASP.NET» и назовите приложение «CRUDSilverlight».
  • Нажмите кнопку «ОК»

Шаг 2. Создайте «модель данных объекта ADO.NET»

После создания нового проекта ASP.NET 3.5 Ext вам необходимо добавить «ADO.NET Entity Data Model» в ваш проект. Вы должны сгенерировать модель данных из таблицы, созданной в SQL 2005. Если вы хотите увидеть все скриншоты для добавления ADO.NET Entity Data Model, пожалуйста, отметьте «Создание ADO.NET Entity Data Model» в этой статье .

Шаг 3. Создание службы данных ADO.NET

После добавления ADO.NET Entity Data Model, вы должны добавить «ADO.NET Data Service» в ваш проект. Затем необходимо поместить имя класса источника данных в первую строку и раскомментировать «config.SetResourceContainerAccessRule (« MyEntityset », ResourceContainerRights.AllRead);» в функции InitializeService (). Замените «MyEntityset» на «*» и измените «AllRead» на «Все».

public class WebDataService1 : WebDataService<MyStoreModel.MyStoreEntities>
{
// This method is called once during service initialization to allow
// service-specific policies to be set
public static void InitializeService(IWebDataServiceConfiguration config)
{
// TODO: set rules to indicate which entity sets and service operations are
// visible, updatable, etc.
// (for testing purposes use "*" to indicate all entity sets/service
// operations, but that option should NOT be used in production systems)

// Example for entity sets (this example uses "AllRead" which allows reads but not writes)
config.SetResourceContainerAccessRule("*", ResourceContainerRights.All);

// Example for service operations
//config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
}
// Query interceptors, change interceptors and service operations go here
}

Шаг 4. Измените порт автоматического назначения на определенный порт вашего веб-приложения.

Обратите внимание, что этот шаг очень важен. Мы должны использовать статический порт для предотвращения междоменной проблемы. Веб-вкладка находится под окном свойств проекта.

Создание Astoria Proxy для проекта Silverlight

Когда я писал о том, как использовать ADO.NET Data Service в Silverlight , я не использовал Webdatagen.exe для генерации прокси-класса для Astoria. В этом посте Брайант указал мне, как создать прокси-класс . ( Большое спасибо, Брайант ) Итак, мы можем сэкономить время на дублирование класса между проектом Silverlight и веб-проектом ASP.NET.

  • Перейдите в «Командная строка Visual Studio 2008». ( Примечание. Если вы работаете в Windows Vista, вам нужно запустить командную строку с правами администратора. Щелкните правой кнопкой мыши в меню и выберите «Запуск от имени администратора». В противном случае Webdatagen.exe не сможет записать сгенерированный файл в диск. )
  • Перейдите в папку «C: \ Program Files \ Microsoft ASP.NET 3.5 Extensions>».
  • Введите в командной строке следующее. [Sourcecode language = «xml»] «WebDataGen.exe / mode: ClientClassGeneration /outobjectlayer:Products.cs /uri:http://localhost:52799/WebDataService1.svc»[/sourcecode]

    Products.cs — это имя прокси-файла, который мы хотим сгенерировать. http: // localhost: 52799 / WebDataService1.svc — это URL-адрес службы данных ADO.NET.

Затем проверьте Products.cs в Microsoft ASP.NET 3.5 Расширения. Вы можете добавить этот прокси-файл в проект Silverlight.

Ладно. Мы подготовились к выполнению операций CRUD в Silverlight с использованием службы данных ADO.NET. Давайте посмотрим, как выполнять эти операции.

Вставка новой записи в Silverlight

Вы можете создать экземпляр объекта Products и установить название продукта по своему усмотрению. Нам не нужно указывать идентификатор продукта, так как ключом является поле идентификации. Когда мы добавляем данные, мы установим MergeOption в AppendOnly.

try{
MyStoreModel.Products _products = new MyStoreModel.Products();
_products.ProductName = "Windows Vista";

MyStoreModel.MyStoreEntities _mystore = new MyStoreModel.MyStoreEntities(_serviceUriString);
_mystore.MergeOption = Microsoft.Data.WebClient.MergeOption.AppendOnly;
_mystore.AddObject("Products", _products);
_mystore.SaveChanges();

insertTextBlock.Text = "New record has been added successfully. Please check Products table in SQL";
}
catch(Exception ex){
throw ex;
}

Обновление существующей записи в Silverlight

Код ниже предназначен для обновления существующей записи в базе данных. Мы будем использовать MergeOption «OverwriteChanges» для обновления.

try {

MyStoreModel.MyStoreEntities _mystore = new MyStoreModel.MyStoreEntities(_serviceUriString);
_mystore.MergeOption = Microsoft.Data.WebClient.MergeOption.OverwriteChanges;

MyStoreModel.Products _products = new MyStoreModel.Products();
_products.ProductID = 1;
_products.ProductName = "Visual Studio 2008 Professional";

_mystore.AttachObject("Products", _products);
_mystore.UpdateObject(_products);
updateTextBlock.Text = "ProductID(#1) has been updated successfully. Please check Products table in SQL";

_mystore.SaveChanges();

}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}

Замечания:

ReadMe.txt Астории сказал ~

— Обновление (вызов метода UpdateObject, за которым следуют методы SaveChanges) может вернуть исключение, даже если операция завершилась успешно на стороне сервера.

Таким образом, вы получите исключение при обновлении записи. но не беспокойся об этом. Ваша запись будет обновлена ​​в базе данных SQL, даже если вы получили исключение. Это известная проблема, которая будет исправлена ​​в следующем выпуске.

Извлечение записи из базы данных в Silverlight

Следующий код предназначен для извлечения записи из базы данных. Вы также можете прочитать другой пост «Использование службы данных ADO.NET» в моем блоге.

try {

MyStoreModel.MyStoreEntities _mystore = new MyStoreModel.MyStoreEntities(_serviceUriString);
_mystore.MergeOption = Microsoft.Data.WebClient.MergeOption.OverwriteChanges;

Microsoft.Data.WebClient.WebDataQuery<MyStoreModel.Products> products = _mystore.CreateQuery<MyStoreModel.Products>("/Products?$orderby=ProductID");

double top=0;
foreach (MyStoreModel.Products p in products) {
TextBlock tbk = new TextBlock();
tbk.Text = p.ProductName;
tbk.Height = 50;
top += tbk.Height;
tbk.SetValue(TopProperty, top);
view.Children.Add(tbk);
}
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}

Удаление записи в Silverlight

try {

MyStoreModel.MyStoreEntities _mystore = new MyStoreModel.MyStoreEntities(_serviceUriString);
_mystore.MergeOption = Microsoft.Data.WebClient.MergeOption.OverwriteChanges;

MyStoreModel.Products _products = new MyStoreModel.Products();
_products.ProductID = 1;

_mystore.AttachObject("Products", _products);
_mystore.DeleteObject(_products);
_mystore.SaveChanges();

deleteTextBlock.Text = "ProductID(#1) has been deleted successfully. Please check Products table in SQL";
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}

Хранение конфигов в XML

Поскольку в проекте Silverlight нет настроек или web.config, я решил использовать файл XML для хранения информации о конфигурации. Но я думаю, что может быть лучше, если мы изменим расширение на config в реальном проекте. В этом примере я сохранил URI службы в файле Configs.xml.

<?xml version="1.0" encoding="utf-8" ?>
<ServiceUriString>http://localhost:52799/WebDataService1.svc</ServiceUriString>

Поскольку я не хочу загружать этот XML с помощью WebRequest, я встроил этот XML в проект. Следующий код предназначен для чтения XML-файла в Silverlight.

 

 Stream stream = this.GetType().Assembly.GetManifestResourceStream("SilverlightProject1.Configs.xml");
XmlReader reader = XmlReader.Create(stream);
while (reader.Read()) {
if (reader.IsStartElement()) {
if ("ServiceUriString" == reader.LocalName) {
reader.Read();
string _serviceURL = reader.Value;
reader = null;
stream.Dispose();
return _serviceURL;
}
}
}

reader = null;
stream.Dispose();
return string.Empty;

 

Вывод

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

Вопросы и ответы

  1. Когда я извлекал запись из базы данных, я получил это исключение «Данные на корневом уровне недействительны. Строка 1, позиция 1». Зачем?

    UriString для службы данных неверен. Пожалуйста, проверьте, есть ли у вас ошибка опечатки или нет. Другое дело, что UriString чувствительна к регистру.

  2. Я получаю это исключение «Операция недопустима из-за текущего состояния объекта». при обновлении записи. Зачем?

    Как я писал в разделе «Обновление записи», это известная проблема, которая будет исправлена ​​в следующем выпуске. Ваша запись будет обновлена ​​в базе данных, но вы получите исключение. Просто игнорируйте исключение.
  3. «Невозможно обновить EntitySet« Продукты », так как в нем есть элемент DefiningQuery и отсутствует элемент <InsertFunction> в элементе <ModificationFunctionMapping> для поддержки текущей операции».

    Просто удалите модель объекта в своем проекте. И заново создайте новый. Я столкнулся с этой проблемой, когда создавал этот образец. То, что я сделал, я создал Entity Model в VS без создания первичного ключа в таблице Products. Когда я попытался вставить новую запись, я получил эту ошибку. Итак, я удаляю модель Entity и заново создаю ее. Это решит проблему. Я думаю, что был бы другой хороший способ сделать это, но я не знаю. Было бы здорово, если бы кто-то показал мне дорогу.

  4. Я пытаюсь сгенерировать прокси-класс с помощью WebDataGen.exe. но файл не был создан, даже если в командной строке не отображается ошибка.

    Если вы пользователь Windows Vista, вам нужно работать от имени администратора при запуске командной строки.
  5. Где вы хранили сервисный URL в своем проекте Silverlight?

    Поскольку здесь нет параметра или web.config, я сохранил строку подключения в Configs.xml, который установлен как «Встроенный ресурс» в Silverlight. Существует один класс с именем «Configs.cs», который будет читать строку URL-адреса службы из этого XML-файла. ,

  6. У меня есть другие вопросы, которые не включены в часто задаваемые вопросы. Итак, как я могу связаться с вами?

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