Любой объектно-ориентированный DAL, подключающийся к любой системе хранения, которая не сохраняет объекты, реализует ORM. Обычно считается, что ORM означает что-то похожее на Hibernate, но важная вещь - это обработка несовпадений импеданса.
[Expanded]
На уровне данных возникает несоответствие импеданса, когда вы отображаете данные одного типа (реляционные) в данные другого (OO).
Например, сколько раз вы видели строку, подобную приведенной ниже, в вашем DAL?
db.AddInParameter(dbCommand, "Name", DbType.String, name);
Или с другой стороны
customerId = Convert.ToInt64(dr["CustomerID"].ToString());
При отображении примитивных типов данных возникает много проблем.
На уровне объекта ваш DAL должен возвращать структуры, которые вы намереваетесь использовать. Будь то какой-то бизнес-объект или просто набор необработанных данных. И ваш собственный DAL, и ORM должны справиться с этим.
На уровне проектирования объекты, которые вы строите, отражают ваши сохраненные данные. Таким образом, структурная разница может возникнуть. Они также обрабатываются для вас в решениях ORM, но вы должны будете сделать то же самое в DAL. Например, в вашем ОО-коде было бы неплохо реализовать правильное наследование, но это нелегко преобразовать в нечто реляционное.
Я просто хотел отметить, что ORM - это термин, придуманный для обозначения продуктов, которые автоматизируют многое из того, что вам уже придется делать в рамках вашего DAL. Решения ORM облегчат жизнь и обеспечат большое количество преимуществ качества / производительности. Но это не меняет того факта, что одним из основных компонентов вашего DAL является создание собственного ORM.