2009-03-26 3 views
7

У меня есть бизнес-объекты (DEVELOPERS WRITE) и некоторые SPROCS (DBA WRITE)Какой ORM лучше при использовании хранимых процедур

Может кто-нибудь порекомендовать хороший объект картографа, чтобы иметь дело с такого рода установки.

Я пробовал коды и nhibernate и имел проблемы. Я не возражаю, если мой ORM свободен или оплачен.

+2

Я не понимаю, что так плохо в sprocs. Иногда это всего лишь вещь. Откуда у них такое плохое имя? – Cheeso

+0

Ну, есть много людей, которые им не нравятся. Они великолепны, когда речь идет о настройке запроса на производительность, но кошмар для обслуживания, например, у одного из моих проектов есть 400+ sprocs .... Благодарим за сравнение схемы в VSTS. – Jojo

+0

Я ищу похожие решения, так как наш новый технологический лидер * * настаивает на том, что все взаимодействия между базами данных с помощью хранимых процедур.Каждая операция CRUD. Каждый запрос. Все. Но он хочет иметь полностью общий DAL :-) – CMPalmer

ответ

7

SubSonic имеет отличную поддержку для sprocs. Он будет обертывать каждый из них в вспомогательном методе, и вы можете получать строго типизированные коллекции или сущности из результатов, если хотите. Я показываю способ сделать это в this blog post. Пока ваш sproc возвращает ту же схему, что и SELECT * FROM TableName, она будет работать с вашими субсоническими объектами.

Что касается создания классов на основе вашего db, SubSonic генерирует частичные классы, поэтому вы можете продлить их по мере необходимости. Вы также можете делать сопоставления из классов, сгенерированных SubSonic, в вашу фактическую модель.

+0

точно так же, как linq2sql - как насчет нескольких наборов результатов в 1 процедуре, возможно, сопоставленной с сущностями? :) – eglasius

+0

Вы просто избили! –

+0

Я считаю, что вы можете загружать только несколько наборов результатов в массивы данных. –

1

Дизайнер LINQ to SQL предоставит вам типы безопасных sprocs как методы объекта DataContext. Вы можете легко сопоставить их с объектами для операций CRUD.

Фактически, я в середине делаю именно это.

+0

Проблема с LINQ to SQL заключается в том, что Microsoft довольно убила продукт. И есть все, что связано с платформой Entity. – Jojo

+0

@ На самом деле, у меня нет ссылки, но на нее был еще один ответ, и мы получили обновление, что есть команда с текущими действиями с linq2sql. – eglasius

+0

Было бы хорошо, если бы у вас была ссылка, но я буду google и посмотрим, смогу ли я его найти, в последний раз я слышал, что он был передан команде ADO, что является тупиком. – Jojo

2

В зависимости от базы данных Entity Framework, или NHibernate, скорее всего, ваши лучшие варианты (примеры в ссылках).

+0

Нет, Nhibernate не работает хорошо с sprocs, если только я чего-то не хватает. Это требует, чтобы предметы возвращались в патикулярном порядке и имели другие ограничения. – Jojo

0

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

Например, если вы используете linq2sql, у вас будет довольно много оберток для SP. Вы также можете сопоставить вставку, удаление и обновление сгенерированных объектов хранимым процедурам. Когда вы теряете много информации о поиске информации, как потому, что теперь запросы исправлены (и вы можете получить больше информации, чем необходимо, то есть дополнительные столбцы, или создать множество SP) и при ленивой загрузке.

Обновление: Я больше парень linq2sql, но я бы сделал второй обзор предположений, которые вы принимаете в NHibernate. В частности, я сомневаюсь, что это заставит порядок столбцов, поскольку он настроен с именами столбцов (см. http://nhibernate.info/blog/2008/11/23/populating-entities-from-stored-procedures-with-nhibernate.html). Он также поддерживает то, что я не знаю, как это сделать с linq2sql: http://nhibernate.info/blog/2008/11/23/populating-entities-with-associations-from-stored-procedures-with-nhibernate.html. Заметьте, я не имею в виду, что последний не поддерживается linq2sql, просто я не знаю, как это сделать;)

5

Дозвуковые имеет гибкое решение:

class CustomerOrder { 
     private string productName; 

     public string ProductName { 
      get { return productName; } 
      set { productName = value; } 
     } 
     private int total; 

     public int Total { 
      get { return total; } 
      set { total = value; } 
     } 

    } 

Тогда:

List<CustomerOrder> orders = Northwind.SPs.CustOrderHist("ALFKI") 
     .ExecuteTypedList<CustomerOrder>(); 

Дозвуковых является твердым "швейцарским армейским ножом" стиль ОРМ.

1

Поскольку у вас есть DBA, пишущий sprocs, я бы подумал, что лучше всего будет работать с ним, чтобы выяснить, как сопоставлять таблицы с объектами и как структурировать базу данных так, чтобы она работает с вашей моделью домена. В sprocs нет ничего плохого, они просто требуют тесного сотрудничества между разработчиками и администраторами баз данных.

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

0

Мне нравится, как Entity Framework обрабатывает sprocs прямо сейчас. Вы можете связать sprocs с операциями crud объекта, он даже обнаруживает, какие sprocs соответствуют свойствам вашего объекта. Один большой недостаток прямо сейчас - если вы связываете один sproc с сущностью, вы должны связать все операции crud с sproc.

В этом EF Sproc article есть несколько отличных примеров использования sprocs в EF, а также некоторые действительно приятные методы расширения для него.

5

Отказ от ответственности: Я являюсь автором Dapper.


Если вы ищете простой объект картографа, который управляет отображением проки для бизнес-объектов Dapper хорошо подходит.

Имейте в виду, что оно не имеет «управления графом», «карты идентификации» и т. Д. Он предлагает голые кости, полное решение, которое охватывает многие сценарии других ORM, нет.

Тем не менее, он предлагает один из самых быстрых материализаторов объектов, который может быть в 10 раз быстрее, чем EF или даже в 100 раз быстрее, чем дозвуковой в некоторых benchmarks.


тривиальное:

create proc spGetOrder 
    @Id int 
as 
select * from Orders where Id = @Id 
select * from OrderItems where OrderId = @Id 

Может быть сопоставлен со следующим:

var grid = cnn.QueryMultiple("spGetOrder", new {Id = 1}, commandType: CommandType.StoredProcedure); 
var order = grid.Read<Order>(); 
order.Items = grid.Read<OrderItems>(); 

Кроме того, вы имеете поддержку:

  1. мульти-картографа, который позволяет вам отдельные строки для нескольких объектов
  2. Input/Output/Return поддержка парам
  3. расширяемый интерфейс для БД конкретной обработки (например, TVPs)

Так, например параметра:

create proc spGetOrderFancy 
    @Id int, 
    @Message nvarchar(100) output 
as 
set @Message = N'My message' 
select * from Orders join Users u on OwnerId = u.Id where Id = @Id 
select * from OrderItems where OrderId = @Id 
return @@rowcount 

Может быть сопоставлен с:

var p = new DynamicParameters(); 
p.Add("Id", 1); 
p.Add("Message",direction: ParameterDirection.Output); 
p.Add("rval",direction: ParameterDirection.ReturnValue); 
var grid = cnn.QueryMultiple("spGetOrder", p, commandType: CommandType.StoredProcedure); 
var order = grid.Read<Order,User,Order>((o,u) => {o.Owner = u; return o;}); 
order.Items = grid.Read<OrderItems>(); 

var returnVal = p.Get<int>("rval"); 
var message = p.Get<string>("message"); 

Наконец, dapper als о позволяем для реализации пользовательских параметров:

public interface IDynamicParameters 
{ 
    void AddParameters(IDbCommand command); 
} 

При реализации этого интерфейса вы можете сказать щеголеватыми, какие параметры вы хотите добавить к вашей команде. Это позволяет поддерживать функции Table-Valued-Params и другие специфичные для БД функции.

Смежные вопросы