Мне нужен некоторый совет специалиста на сильных введенных наборах данных в ADO.NET, который сгенерирован Visual Studio. Вот детали.Заранее спасибо.
Я хочу записать приложение N-tier, где Уровень представления находится в формах C#/windows, Бизнес-Слой является веб-сервисом, и Уровень доступа к данным является дб SQL.
Так, я использовал Visual Studio 2005 для этого и создал 3 проекта в решении.
проектом 1 является Уровень доступа к данным. В этом я использовал генератор набора данных Visual Studio для создания сильного введенного набора данных и адаптера таблицы (для тестирования, я создал это на таблице клиентов в northwind). Набор данных называют NorthWindDataSet, и таблицей внутри является CustomersTable.
проект 2 имеет веб-сервис, который выставляет только 1 метод, который является GetCustomersDataSet. Это использует адаптер таблицы project1 библиотеки, чтобы заполнить набор данных и возвратить его вызывающей стороне. Чтобы смочь использовать NorthWindDataSet и адаптер таблицы, я добавил ссылку на проект 1.
проект 3 является приложением форм победы, и это использует веб-сервис в качестве ссылки и вызовов что сервис для получения набора данных.
В процессе создавания этого приложения, в МН, я добавил ссылку на DataSet, сгенерированный выше в проекте 1 и в загрузке формы, которую я называю веб-сервисом и присваиваю полученный DataSet от веб-сервиса до этого набора данных. Но я получаю ошибку:
Не может неявно преобразовать тип 'PL.WebServiceLayerReference. NorthwindDataSet' к 'BL.NorthwindDataSet' e:\My Documents\Visual Studio 2008\Projects\DataSetWebServiceExample\PL\Form1.cs
Оба наборы данных - то же, но потому что я добавил ссылки от различных местоположений, я получаю вышеупомянутую ошибку, я думаю.
Так, что я сделал был, я добавил ссылку на проект 1 (который определяет набор данных) к проекту 3 (UI), и использовал веб-сервис, чтобы получить DataSet и присвоиться к правильному типу, теперь когда проект 3 (который имеет веб-форму) выполнения, я добираюсь ниже исключения на этапе выполнения.
Система. InvalidOperationException: существует ошибка в XML-документе (1, 5058).---> Система. Xml. Схема. XmlSchemaException: Повторное определение элемента 'http://tempuri.org/NorthwindDataSet.xsd:Customers' заставляет модель содержания становиться неоднозначной. Модель содержания должна быть сформирована таким образом, что во время проверки последовательности объекта информации об элементе, частица, содержавшая непосредственно, косвенно или неявно там, с которым можно попытаться проверить каждый объект в последовательности в свою очередь, может быть исключительно определена, не исследуя содержание или атрибуты того объекта, и ни без какой информации об объектах в остатке от последовательности.
Я думаю, что это могло бы быть из-за некоторого креста referenceing ошибками.
Мой вопрос, там способ использовать Visual Studio, сгенерированную DataSets таким способом, которым я могу использовать тот же DataSet во всех слоях (для повторного использования), но разделить логику Адаптера Таблицы к Уровню доступа к данным так, чтобы фронтэнд был абстрагирован от всего этого веб-сервисом?
Если у меня есть рука, пишут код, я освобождаю совершенство, которое генератор набора данных дает и также если существуют столбцы, добавленные позже, я должен добавить его вручную и т.д., таким образом, я хочу использовать мастер Visual Studio как можно больше.
Я бы поддержал здесь Джона, мы используем EF v1.0 в N-уровневом приложении, и, конечно, у него есть свои проблемы, но вы получаете обычные объекты, которые можно передавать через службу. Однако я бы посоветовал (если вы выберете EF1, а не EF4, который имеет возможность отображать его объекты как POCO) иметь отдельный слой объектов DTO, которые я бы сопоставил с объектами DO из вашего DAL, и использовать DTO для передачи через службу . Также подумайте об использовании служб .NET RIA, они действительно великолепны
@sb: на DTO , на EF , быстрый обзор служб RIA , {{ 1}} старая статья о DTO с наборами данных , что вы пытаетесь сделать.
На вашем месте я бы держался подальше от наборов данных. Они во многом являются решением проблемы .NET 2.0, но тоже не очень хорошим решением.
Я бы использовал Entity Framework в качестве уровня данных - у них нет проблем с DataSet, включая ту, которую вы видите. DataSet должен жить в обоих мирах - и XML, и реляционном, и они не всегда подходят друг другу. Entity Framework может создавать вам модели сущностей, которые должны соответствовать только стандартным концепциям программирования, таким как наследование и ассоциация.
Entity Framework также имеет меньше проблем при передаче через веб-службы. Вы должны использовать WCF для всей работы с новыми веб-службами (Microsoft теперь считает веб-службы ASMX «устаревшей технологией»), но даже с веб-службами ASMX объекты EF будут передаваться довольно чисто. В .NET 3.5 есть несколько относительно незначительных проблем, но они решены в .NET 4.0.
У меня вопрос: есть ли способ использовать DataSet, сгенерированные Visual Studio, таким образом, чтобы я мог использовать один и тот же DataSet на всех уровнях (для повторного использования), но отделить логику адаптера таблицы от уровня доступа к данным, чтобы передняя часть end абстрагируется от всего этого веб-службой
. Если вы не хотите переписывать свое приложение для EF или добавлять DTO и знаете, что схемы равны, вы можете установить схему набора данных на уровне представления с помощью веб-сервис.
Project3DataSet.ReadXmlSchema(
new StringReader(Project2WebService.GetCustomersDataSetSchema()));
[WebMethod]
public string GetCustomersDataSetSchema()
{
return new Project1DataSet().GetXmlSchema();
}
Схема набора данных действует как объектная модель. Не очень красиво, но должно сработать.
С учетом сказанного, если это новый проект, я согласен с другими ответами - избегайте наборов данных.