Posted by Chris Brandsma on Oct 29, 2009 in
- Dotnet |
View Original Article
AutoMapper is one those tools tools that seems to be gaining in popularity lately, generating a lot of talk on the web and at user groups. Seemed like a good idea to talk with its creator, Jimmy Bogard, and get the run-down on it.
In this code case we have Elegant Coders Chris Brandsma and Richard Cirerol (listen as Chris completely stumbles over Rich’s last name), and we are joined by Cory Isakson. For those of you outside of Bosie, Cory is a local usergroup leader, Code Camp presenter, and .net junky. We keep trying to get Cory to blog, but so far he is resisting our calls.
Get the show here

Tags: AutoMapper, CodeCast
Posted by Jan Van Ryswyck on Oct 16, 2009 in
- Dotnet |
View Original Article
A while ago, I submitted a patch to AutoMapper that added basic support for mapping data from an IDataReader/IDataRecord to an object. For those of us who don’t have the luxury to use NHibernate in their projects, this feature can save you from writing lots of repetitive and tedious code.
Its usage is pretty much the same as with regular object-to-object mapping using AutoMapper. Lets show a very simple example.
Suppose we have a view object like the one shown below:
public class SomeView
{
public Int32 SomeNumber { get; private set; }
public Guid AnId { get; private set; }
public Double OrNothing { get; private set; }
}
Now when we can execute a query like this,
SELECT ColumnA AS SomeNumber,
ColumnB AS AnId,
ColumnC AS OrNothing
FROM SomeTable
WHERE ...
and read the results using a data reader. Now we can use AutoMapper to map the results to instances of our view class:
var dataReader = ... // Execute a data reader
var views = Mapper.Map<IDataReader, IEnumerable<SomeView>>(_dataReader);
This results in a collection of one of or more view objects. When our query is guaranteed to always return one record, we can use the following syntax:
var dataRecord = ... // Execute data reader and read first record
var = Mapper.Map<IDataRecord, SomeView>(_dataRecord);
This approach expects that a convention is followed whereby the name of a field returned by the query matches the name of a property on the target class. Its also possible to use projection as already provided for regular object-to-object mapping.
Suppose we add a new property to our view,
public class SomeView
{
...
public DateTime SomeDate { get; private set; }
}
and we modify the query so that we retrieve the corresponding date value from the database:
SELECT ...
ColumnD AS BirthDay
FROM SomeTable
Notice that we’ve broken the convention here and we need to use projection to ensure that the retrieved date value is mapped to the correct property.
Mapper.CreateMap<IDataRecord, SomeView>()
.ForMember(dest => dest.SomeDateAndTime,
options => options.MapFrom(
src => src.GetDateTime(src.GetOrdinal("BirthDay"))));
var dataRecord = ... // Execute data reader and read first record
var = Mapper.Map<IDataRecord, SomeView>(_dataRecord);
Using projection we’re able to manually map from a data reader or data record. In some sense, we’re back to square one if we have to do this for all fields. Trying to follow the convention is of course the most useful.
I know its not much, but I think it can be helpful for those cases where you actually need to map from a data reader or a data record to an object.
Tags: AutoMapper