Автоматическое создание DAL в приложении ASP.NET

Учитывая хранимую процедуру, есть ли способ автоматически сгенерировать уровень доступа к данным? Я понимаю, что это можно сделать с помощью Codesmith, создав шаблоны cs, но мне было интересно, есть ли там бесплатное/платное решение.

План состоит в том, чтобы архитектура имела:

Код ASP.NET позади -> Бизнес-уровень -> Уровень доступа к данным -> Хранимая процедура.

Слой BL действует как переход к DAL и также может генерироваться автоматически.

Любые советы/советы действительно ценятся!


person Nick    schedule 28.10.2009    source источник
comment
Вы можете использовать ORM, есть много бесплатных вариантов, но ORM, как правило, предлагают большую ценность при использовании с таблицами, а не с хранимыми процедурами.   -  person Michael Maddox    schedule 28.10.2009
comment
Если вы готовы рассмотреть коммерческие (небесплатные) варианты, каковы, с вашей точки зрения, недостатки CodeSmith?   -  person Michael Maddox    schedule 28.10.2009
comment
CodeSmith отлично работает! Я хотел знать, есть ли другой инструмент, который поможет мне получить преимущество. Я также склонялся к чему-то, что является частью .NET framework (или что-то от Microsoft), а CS — это сторонний инструмент.   -  person Nick    schedule 28.10.2009
comment
Является ли общепринятой практикой идти против таблиц, а не против SP? Каковы плюсы и минусы? Спасибо   -  person Nick    schedule 28.10.2009
comment
Если вы используете хранимые процедуры, я бы, вероятно, рекомендовал вам придерживаться CodeSmith. Это не похоже на то, что вы действительно хотите / нуждаетесь в ORM. Хранимые процедуры против таблиц/динамического SQL — очень спорный вопрос, и вы не получите простого и четкого ответа на него.   -  person Michael Maddox    schedule 28.10.2009


Ответы (6)


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

LINQ to SQL очень удобен для хранимых процессов. Запустите SQLMETAL с параметром /procs, чтобы он автоматически сгенерировал ваш DAL.

Однако два ограничения:

  1. LINQ to SQL не будет запускать хранимые процедуры, использующие динамический SQL.
  2. LINQ to SQL также не будет запускать хранимые процедуры, которые возвращают данные из временных таблиц.

Очевидная первая причина заключается в том, что LINQ to SQL не может генерировать необходимые метаданные для этих процедур, но динамический SQL в хранимых процедурах в любом случае является плохой практикой.

person Cylon Cat    schedule 28.10.2009
comment
Из доступных ORM LinqToSql имеет лучшую поддержку хранимых процедур. Тем не менее, LinqToSql — это довольно бедная ORM, и я бы не рекомендовал его для большинства проектов, учитывая превосходные альтернативы, которые находятся в свободном доступе. Также интересно, что вы рекомендуете SQLMetal, когда это не является строго обязательным. - person Michael Maddox; 28.10.2009

Просто используйте Entity Framework:
http://msdn.microsoft.com/en-us/library/bb399203.aspx

person Joel Martinez    schedule 28.10.2009

Я пока не предлагаю вам использовать Entity Framework, так как у него все еще есть много особенностей. Когда .NET 4.0 будет официально выпущен, у вас будет Entity Framework 4.0. В этом выпуске я, вероятно, откажусь от NHibernate и LINQ to SQL (у обоих очень разные роли) и просто буду использовать EF, поскольку он сочетает в себе простоту использования LINQ to SQL и гибкость NH.

А пока я предлагаю вам использовать LINQ to SQL, так как его очень легко настроить и запустить, и в большинстве случаев он просто работает!

person Andrew Siemer    schedule 28.10.2009
comment
Учитывая, что выпуск этого проекта запланирован на конец первого квартала 2010 года, и учитывая, что это будет фреймворк для довольно крупного приложения, вы предлагаете мне взять копию бета-версии VS 2010 и фреймворка .NET и использовать EF? - person Nick; 28.10.2009
comment
NHibernate уже давно поддерживает Linq. У каждой ORM есть свои особенности. - person Michael Maddox; 28.10.2009
comment
@OP Учитывая, что выпуск VS2010 в настоящее время намечен на март 2010 года, и эта дата может сдвинуться, я бы не рекомендовал брать на себя эту зависимость. - person Michael Maddox; 28.10.2009
comment
Как я уже сказал... ждите официального релиза! LINQ to SQL или LINQ to NHibernate... свободное владение NHibernate... и т. д. - person Andrew Siemer; 28.10.2009

Linq2SQL или SubSonic хорошо подходят для этой цели.

Редактировать: Linq2Sql предположительно «мертв», но все еще весьма полезен в своем нынешнем виде. Я просто не стал бы вкладывать в него долгосрочные инвестиции.

person Chris    schedule 28.10.2009
comment
Утверждение, что он мертв, было правильным около 6 месяцев назад. Однако команда, работающая над EF, также работает над L2S, и в L2S будет добавлено много новых функций в выпуске .NET 4.0. - person Andrew Siemer; 28.10.2009
comment
@ Эндрю У тебя есть источник этого утверждения? - person Michael Maddox; 28.10.2009
comment
@Amr В этом сообщении в блоге ничего не говорится о том, что LinqToSql использует значительно больше ресурсов для создания важных новых функций. - person Michael Maddox; 28.10.2009
comment
Человеку, который проголосовал против, какая причина? Комментарий мне показался довольно невинным.. - person Chris; 29.10.2009
comment
@ Крис, я не понижаю голос, но у любого, кто является поклонником LinqToSql, есть причина понизить ваш ответ. Вы можете улучшить свой ответ, объяснив, почему вы считаете, что ваш выбор лучше, чем другие варианты. - person Michael Maddox; 29.10.2009
comment
Одна плохая вещь о SubSonic, он не очень хорошо работает в среде со средним уровнем доверия, поскольку он использует отражение, когда выполняет некоторые из своих динамических запросов. - person Chris; 03.02.2010

Еще одно голосование за платформу Entity, хотя это будет зависеть от базовой структуры таблицы, а не от хранимой процедуры. Я не знаю, как разрешить Entity Framework определять структуру класса на основе сохраненных выходных данных процедуры.

Я определил, что наш лучший подход — вручную кодировать наши классы и хранимые процедуры CRUD. Многие будут спорить с этим решением, но по моему опыту, использование любого вида ORM-фреймворка приводит к неоптимальному SQL, который ограничен, особенно с учетом возможностей использования хранимых процедур, которые будет блокировать фреймворк.

Клише существуют не просто так: если хочешь, чтобы все было сделано правильно, сделай это сам. Чем больше сторонних компонентов вы вводите в свое приложение, тем больше проблем вы просите решить, которые не находятся под вашим непосредственным контролем. Я ненавижу подписываться на синдром Not-Invented-Here, но это тот случай, когда я считаю, что это действительно так.

person 3Dave    schedule 28.10.2009
comment
Какие ORM, которые вы пробовали, не соответствуют вашим потребностям? Entity Framework вряд ли известен своей способностью генерировать производительный SQL. - person Michael Maddox; 28.10.2009