2012-02-14

NHibernate - mapowanie

NHibernate możemy poinformować o sposobie w jaki powinien mapować obiekty na struktury bazy danych na kilka sposobów

1.
Mapowanie przez kod, w przypadku gdy nasze mapowanie jest rozdzielone od obiektów:

public class Customer 
{
    public int Id { get; set; }
    public string FirstName { get; set; }
}

public class CustomerMapping : ClassMapping<Customer>
{
    public CustomerMapping()
    {
        Lazy(false);
        Id<int>(x => x.Id, map => map.Generator(Generators.HighLow));
        Property<string>(c => c.FirstName, 
            map => { map.Length(10); map.NotNullable(true); });
    }
}

ModelMapper mapper = new ModelMapper();
mapper.AddMapping<CustomerMapping>();
HbmMapping mapping = mapper.CompileMappingFor(new[] { typeof(Customer) });

Nasz obiekt nie jest w żaden sposób związany z klasami NHibernate.

2.
Mapowanie przez kod, w przypadku gdy nie chcemy tworzyć osobnych obiektów mapujących.

public interface IClassMapping
{
    void Map(ModelMapper a_mapper);
}

public class Customer : IClassMapping
{
    public int Id { get; set; }
    public string FirstName { get; set; }

    public void Map(ModelMapper a_mapper)
    {
        a_mapper.Class<Customer>(m =>
        {
            m.Id(x => x.Id, map => map.Generator(Generators.HighLow));
            m.Property(c => c.FirstName, 
                map => { map.Length(10); map.NotNullable(true); });
            m.Lazy(false);
        });
    }
}

Interfejs jest nam w tym przypadku potrzebny do automatyczneo namierzania klas:

private static void AddMappings()
{
    ModelMapper mapper = new ModelMapper();

    foreach (var asm in AssembliesToMap)
    {
        var types = from type in asm.GetTypes()
                    where !type.IsInterface
                    where type.IsImplementInterface(typeof(IClassMapping))
                    where !type.IsAbstract
                    select type;

        foreach (var type in types)
            (Activator.CreateInstance(type) as IClassMapping).Map(mapper);
    }

    HbmMapping mapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
    Configuration.AddDeserializedMapping(mapping, "MangaCrawler"); 
}

3.
Mapowanie z wykorzystaniem atrybutów.

4.
Mapowanie z wykorzystaniem XML.

5.
Wykorzystanie zdarzeń klasy ModelMapper do dekorowania. Dzięki temu możemy jak mi się wydaje możemy obejść się dla większości elementów bez ręcznego mapowania. Np. możemy zdefiniować konwencję nazewnictwa kolumn w bazie, automatycznie podłączyć generatory id... Dokładnie tego nie sprawdzałem, być może jeszcze wiele innych rzeczy można ustandaryzować.

Brak komentarzy:

Prześlij komentarz