Быстрый старт с Fluent NHibernate. Часть 3. Автомэппинг

Совсем забыл в предыдущей части ( netcoder.ru/blog/csharp/130.html ) коснуться такой замечательной возможности Fluent NHibernate, как автомэппинг.

Здесь вкратце рассмотрим ее.

Вы уже помните, что мы делали для мэппинга сущностей?
Создавали классы-наследники от ClassMap<>, указывали свойства для мэппинга и тп.

примерно так:

public class CustomerMap: ClassMap<Customer>
    {
        public CustomerMap()
        {
            Id(x => x.UID).GeneratedBy.Guid();
            Map(x => x.Comment);
            Map(x => x.FirstName).Not.Nullable();
            Map(x => x.SecondName);
            HasMany(x => x.Orders)
                .KeyColumns.Add("CustomerID")
                .Inverse()
                .Cascade.All();
        }
    }


Для экономии времени и минимизации кода всего этого можно избежать, создав код автомэппинга:


 AutoPersistenceModel mappings = AutoMap.AssemblyOf<EntityBase>()
                .Setup(map => map.FindIdentity = property => property.Name == "UID")
                .Conventions.Setup(c =>
                    {
                        c.Add<CustomForeignKeyConvention>();
                        c.Add<DefaultStringLengthConvention>();
                        c.Add<IdentityGeneratorConvention>();
                    })
                .IgnoreBase<EntityBase>();

            autoMappings.CompileMappings();


Что такое Conversions ?
Конверсии помогают нам задать правила для создания автомэппинга.
Вот некоторые из них:


 public class CustomForeignKeyConvention : ForeignKeyConvention
    {
        protected override string GetKeyName(PropertyInfo property, Type type)
        {
            if (property == null)
                return type.Name + "_FK";

            return property.Name + "_FK";
        }
    }

    public class DefaultStringLengthConvention : IPropertyConvention
    {
        public void Apply(IPropertyInstance instance)
        {
            instance.Length(250);
        }

    }

    public class IdentityGeneratorConvention : IIdConvention
    {
        #region IConvention<IIdentityInspector,IIdentityInstance> Members

        public void Apply(IIdentityInstance instance)
        {
            instance.GeneratedBy.Guid();
        }

        #endregion
    }



Думаю здесь все понятно.

Теперь немного нужно изменить конфигурацию:

 Config = Fluently.Configure().
                Database(
                    MsSqlConfiguration
                        .MsSql2008
                        .ConnectionString(x => x
                            .Server(@".\SQLEXPRESS")
                            .Database("Orders")
                            .TrustedConnection())
                            .UseReflectionOptimizer())
                .Mappings(m => m.AutoMappings.Add(mappings))     
                .BuildConfiguration();



где mappings — класс AutoPersistenceModel, экземпляр которого мы создали ранее.

Готово! теперь наши мэппинги создаются автоматически и не нужно писать не строчки кода ручного мэппина, ура!
  • +2
  • 5 января 2010, 12:30
  • NetCoder

Комментарии (10)

RSS свернуть / развернуть
+
0
не знаю… по-моему слишком тяжеловесное решение… к тому же тут приходится полностью полагаться на NHibernate в плане запросов к БД и их оптимизации… при работе с реально большими базами не факт что это будет оптимальное решение…
я лично юзаю bltoolkit
avatar

tonage

  • 5 января 2010, 13:28
+
0
а с какого рода оптимизации приходилось сталкиваться и как часто?
проводились ли сравнения оптимизаций? покрывает ли использование BLToolkit затраты на изучение и время на разработку? Будет возможность — напиши статейку, заценим.

я лично вообще юзаю SqlCommand и сам оптимизирую запросы
avatar

NetCoder

  • 5 января 2010, 13:53
+
0
я к тому, что ORM лучше всего использовать на небольших таблицах. а если нужна быстрота — нет ничего лучше SqlCommand =)
avatar

tonage

  • 5 января 2010, 13:54
+
0
если нужна быстрота — то лучше вообще писать Unmanaged code на C++
avatar

NetCoder

  • 5 января 2010, 13:56
+
0
C++ тоже аццкие тормоза. я за ассемблер.
avatar

tonage

  • 5 января 2010, 13:57
+
0
давай сразу писать бинарные коды тогда!
p.s. ну что, седня в 20-00 все в силе?
avatar

NetCoder

  • 5 января 2010, 13:59
+
0
ога
avatar

tonage

  • 5 января 2010, 14:01
+
0
по поводу BLToolkit
все это вопросы предпочтений конечно же. Многим нравится LINQ2SQL например и они с него ни за что не слезут.
Я лично очень люблю Microsoft Entity Framework и принимаю активное участие в его бета тестировании, поэтому это дело вкуса и привычки
каждое решение имеет право на существование. требуется лишь знать, ПОЧЕМУ применяется это решение и насколько это ЭФФЕКТИВНО для данной задачи. тогда все будет ок
avatar

NetCoder

  • 5 января 2010, 14:02
+
0
А есть возможность в Fluent NHibernate использовать хранимые процедуры, скажем, для выборки данных?
avatar

Gogy

  • 24 ноября 2011, 19:02
+
0
умеет, но не напрямую, а через hbm.
в качестве примера предлагаю почитать это:
http://mikaelkoskinen.net/post/fluent-nhibernate-oracle-stored-procedure-mapping.aspx
avatar

NetCoder

  • 26 марта 2012, 19:29

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.