7

I am really torn right now between using O/R mappers or just sticking to traditional data access. For some reason, every time I bring up O/R mappers, fellow developers cringe and speak about performance issues or how they're just bad in general. What am I missing here? I'm looking at LINQ to SQL and Microsoft Entity Framework. Is there any basis to any of these claims? What kind of things do I have to compromise if I want to use an O/R mapper. Thanks.

George Stocker
  • 57,289
  • 29
  • 176
  • 237

8 Answers8

11

This will seem like an unrelated answer at first, but: one of my side interests is WWII-era fighter planes. All of the combatant nations (US, Great Britain, Germany, USSR, Japan etc.) built a bunch of different fighters during the war. Some of them used radial engines (P47, Corsair, FW-190, Zero); some used inline liquid-cooled engines (Bf-109, Mustang, Yak-7, Spitfire); and some used two engines instead of one (P38, Do-335). Some used machine guns, some used cannons, and some used both. Some were even made out of plywood, if you can imagine.

In the end, they all went really really fast, and in the hands of a competent, experienced pilot, they would shoot your rookie ass down in a heartbeat. I don't imagine many pilots flew around thinking "oh, that idiot is flying something with a radial engine - I don't have to worry about him at all". Everyone understood that there were many different ways of achieving the ultimate goal, and each approach had its particular advantages and disadvantages, depending on the circumstances.

The debate between ORM and traditional data access is just like this, and it behooves any programmer to become competent with both approaches, and choose the option that is right for the job at hand.

MusiGenesis
  • 74,184
  • 40
  • 190
  • 334
  • 6
    Voted down because "choosing the right tool for the right job" is such a common and generic answer for any programming question. Instead a better answer would spell out the situations for when an ORM is or isn't appropriate. I'd vote down a second time because using physical analogies to describe program architecture choices always break down once the subtleties are considered. Pilot training times, aircraft maintenance costs, resource usage? – John Farrell Aug 09 '09 at 16:47
  • 1
    @jfar: my point was more general than the way you apparently took it - that people who say "ORM is great and the other way is complete crap" (or vice versa) are just being stupid. And don't say "nobody's saying that", because people say things like that all the time here on SO. As far as physical analogies to software breaking down when you consider the details, I don't like to say "duh", so I won't. – MusiGenesis Aug 09 '09 at 17:43
5

I struggled with this decision for a long time. I think I was hesitant for two primary reasons. First, O/R mappers represented a lack of control over what was happening in a critical part of the app and, second, because so many times I've been disappointed by solutions that are awesome for the 90% case but miserable for the last 10%. Everything works for select * from authors, of course, but when you crank up the complexity and have a high-volume, critical system and your career is on the line, you feel you need to have complete control to tune every query pattern and byte over the wire. Most developers, including me, get frustrated the first time the tool fails us, and we cannot do what we need to do, or our need deviates from the established pattern supported by the tool. I'll probably get flamed for mentioning specific flaws in tools, so I'll leave it at that.

Fortunately, Anderson Imes finally convinced me to try CodeSmith with the netTiers template. (No, I don't work for them.) After more than a year using this, I can't believe we didn't do it sooner. My team uses Visual Studio DB Pro, and on every check-in our continuous integration build drops out a new set of data access layer assemblies. This handles all the common, low risk stuff automatically, yet we can still write custom sprocs for the tricky bits and have them included as methods on the generated classes, and we can customize the templates for the generated code as well. I highly recommend this approach. There may be other tools that allow this level of control as well, and there is a newer CodeSmith template called PLINQO that uses LINQ to SQL under the hood. We haven't that yet examined (haven't needed to), but this overall approach has a lot of merit.

Jerry

Community
  • 1
  • 1
Jerry Bullard
  • 6,116
  • 18
  • 27
2

O/RM tools designed to perform very well in most situations. It will cache entities for you, it will execute queries in bulks, it has a very low level optimised access to objects which is way faster than manually assigning values to properties, they give you a very easy way to incorporate variations of aspect oriented programming using modern technics like interceptors, it will manage entity state for you and help resolve conflicts and many more.

Now cons of this approach usually lies in lack of understanding of how things work on a very low level. Most classic problem is "SELECT N+1" (link).

I've been working with NHibernate for 2.5 years now, and I'm still discovering something new about it almost on a daily basis...

Ray
  • 1,585
  • 9
  • 10
2

Good. In most cases.

The productivity benefit of using an ORM, will in most case outweigh the loss of control over how the data is accessed.

There are not that many who would avoid C#, in order to program is MSIL or Assembly, although that would give them more control.

Shiraz Bhaiji
  • 64,065
  • 34
  • 143
  • 252
  • +1 because of the key word: **productivity**. I implemented a kind of CRM system with a complex database in MySQL. I can not imagine having to do all the mapping manually everytime requirements changed... and it happened like 50 times. – Victor RENÉ Mar 14 '14 at 20:15
1

The problem that i see with a lot of OR mappers is that you get bloated domain objects, which are usually highly coupled with the rest of your data access framework. Our developers cringe at that as well :) It's just harder to port these object to another data access technology. If you use L2S, you can take a look at the generated code. It looks like a complete mess. NHibernate is probably one of the best at this. Your entities are completely unaware of your data access layer, if you design them right.

  • DTO's are actually your pass thru. And, yes, one of their downsides is the class explosion they create. – BozoJoe Sep 29 '09 at 19:55
1

It really depends on the situation.

I went from a company that used a tweaked out ORM to a company that did not use a ORM and wrote SQL queries all the time. When I asked about using an ORM to simplify the code, I got that blank look in the face followed by all the negatives of it:

  • Its High Bloat
  • you don't have fine control over your queries and execute unnecessary ones
  • there is a heavy object to table mapping
  • its not dry code because you have to repeat your self

on an on

Well, after working there for a few weeks, I had noticed that:

  • we had several queries that were almost identical, and alot of times if there was a bug, only a handful would get fixed
  • instead of caching common tables queries, we would end up reading a table multiple times.
  • We were repeating our selves all over the place
  • We had several levels of skill level, so some queries were not written the most efficiently.

After I pointed most of this out, they wrote a "DBO" because the didn't want to call it an ORM. They decided to write one from scratch instead of tweaking out one.

Also, alot of the arguments come from ignorance against ORM's I feel. Every ORM that I have seen allows for custom queries, and even following the ORM's conventions, you can write very complex and detailed queries and normally are more human readable. Also, they tend to be very DRY, You give them your schema, and they figure the rest out, down to relationship mapping.

Modern ORM's have a lot of tools to help you out, like migration scripts, multiple DB types accessed to the same objects so you can leverage advantages of both NOSQL and SQL DB's. But you have to pick the right ORM for your project if your going to use one.

Jdahern
  • 1,196
  • 9
  • 14
0

I first got into ORM mapping and Data Access Layers from reading Rockford Lhotka's book, C# business objects. He's spent years working on a framework for DAL's. While his framework out of the box is quite bloated and in some cases, overkill, he has some excellent ideas. I highly recommend the book for anyone looking at ORM mappers. I was influenced by his book enough to take away a lot of his ideas and build them into my own framework and code generation.

Darthg8r
  • 12,377
  • 15
  • 63
  • 100
0

There is no simple answer to this since each ORM provider will have it's own particular pluses and minuses. Some ORM solutions are more flexible than others. The onus is on the developer to understand these before using one.

However, take LinqToSql - if you are sure you are not going to need to switch away from SQL Server then this solves a lot of the common problems seen in ORM mappers. It allows you to easily add stored procedures (as static methods), so you aren't just limited to generated SQL. It uses deferred execution, so that you can chain queries together efficiently. It uses partial classes to allow you to easily add custom logic to generated classes without needing to worry about what happens when you re-generate them. There is also nothing stopping you using LINQ to create your own, abstracted DAL - it just speeds up the process. The main, thing, though is that it alleviates the tedium and time required to create basic CRUD layer.

But there are downsides, too. There will be a tight coupling between your tables and classes, there will be a slight performance drop, you may occasionally generate queries that are not as efficient as you expected. And you are tied in to SQL Server (though some other ORM technlogies are database agnostic).

As I said, the main thing is to be aware of the pros and cons before pinning your colours to a particular methodology.

Dan Diplo
  • 25,076
  • 4
  • 67
  • 89
  • Most of other O/RM tools allow to map to sprocs just as easy. To name few: (N)Hibernate and EntityFramework. Also Microsoft has stopped working on Linq2Sql so we pretty much stuck with current implementation... – Ray Aug 09 '09 at 11:18
  • Stopped working on Linq2Sql? http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40 – John Farrell Aug 09 '09 at 16:50