Автоматически сопоставлять столбцы со свойствами класса с помощью NHibernate ClassMapping - PullRequest
0 голосов
/ 22 февраля 2020

Я использую настройку NHibernate 5.2, чтобы попробовать его в локальной базе данных SQLExpress.

Моя Category сущность (кстати, это пример Северный ветер база данных)

public class Category
{
    public virtual int CategoryID { get; set; }
    public virtual string CategoryName { get; set; }
    public virtual string Description { get; set; }
    public virtual byte[] Picture { get; set; }
}

My CategoryMap

public class CategoryMap : ClassMapping<Category>
{
    public CategoryMap()
    {
        Table("Categories");
        Id(x => x.CategoryID);
    }
}

Мои тестовые конфигурации и запрос

class Program
{
    static void Main(string[] args)
    {
        Configuration config = new Configuration()
            .DataBaseIntegration(db =>
            {
                db.ConnectionString = @"<my connection string>";
                db.Dialect<MsSql2008Dialect>();
            });

        var mapper = new ModelMapper();
        mapper.AddMappings(new List<Type> {
            typeof(CategoryMap)
        });;

        var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
        config.AddMapping(mapping);

        var sessionFactory = config.BuildSessionFactory();

        using (var session = sessionFactory.OpenSession())
        {
            var categories = session.QueryOver<Category>().List<Category>();
        };

    }
}

Однако я заметил, что в моем тестовом запросе только Поле CategoryID заполнено, остальные поля являются пустыми (в базе данных таблица Categories имеет значения). Если я добавлю больше Property(x => x.<field name>) к CategoryMap, они получат свои соответствующие значения, как и ожидалось. My Categories table

Мой вопрос таков: нужно ли вручную добавлять Property(x => x.<property name here> для каждого столбца в таблице, даже если они имеют идентичные имена со свойствами объекта? Мне не хватает какой-либо конфигурации для автоматического сопоставления?

Спасибо за ваше время.

1 Ответ

1 голос
/ 23 февраля 2020

Оказывается, я неправильно использовал ModelMapper. Я изменил его на ConventionModelMapper и мне просто нужно указать имя таблицы в отображении класса.

Мой новый CategoryMap

public class CategoryMap : ClassMapping<Category>
{
    public CategoryMap()
    {
        Tables("Categories");
        Id(x => x.CategoryID);
        // In db this column's type is image
        // while the property type is byte[] so this explicit property map is needed
        Property(x => x.Picture, m => m.Type(new BinaryBlobType()));
    }
}

Часть моей конфигурации (в том же классе программы, остальные для краткости опущены)

...
// Unlike ModelMapper, this mapper automatically maps class name -> table, property -> column
var mapper = new ConventionModelMapper();
mapper.AddMapping<CategoryMap>();

var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
config.AddMapping(mapping);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...