Какой ORM лучше при использовании хранимых процедур - PullRequest
7 голосов
/ 27 марта 2009

У меня есть Бизнес-объекты (НАПИСАТЕЛЬ РАЗРАБОТЧИКОВ) и некоторые SPROCS (НАПИСАНИЕ DBA)

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

Я пытался использовать коды и nhibernate, и у меня были проблемы. Я не против, если мой ORM бесплатный или платный.

Ответы [ 8 ]

7 голосов
/ 27 марта 2009

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

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

5 голосов
/ 11 июля 2011

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


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

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

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


Тривиально:

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. Поддержка параметров ввода / вывода / возврата
  3. Расширяемый интерфейс для обработки специфических параметров в дБ (например, TVP)

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

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 также допускает реализацию пользовательского параметра:

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

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

5 голосов
/ 27 марта 2009

Subsonic имеет гибкое решение:

    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>();

Subsonic - это твердый ORM в стиле "Швейцарский армейский нож".

2 голосов
/ 27 марта 2009

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

1 голос
/ 27 марта 2009

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

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

1 голос
/ 27 марта 2009

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

На самом деле, я сейчас занимаюсь именно этим.

0 голосов
/ 27 марта 2009

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

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

0 голосов
/ 27 марта 2009

Основная проблема, с которой я сталкиваюсь, заключается в том, что, переходя на 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, просто я не знаю как;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...