使用 NHibernate ClassMapping 自动将列映射到 class 属性

Automatically map columns to class properties with NHibernate ClassMapping

我正在使用设置 NHibernate 5.2 在本地 SQLExpress 数据库上试用它。

我的 Category 实体(顺便说一句,它是示例 Northwind 数据库)

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; }
}

我的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 字段被填充,其他字段为空值(在数据库中,table Categories 它们具有值)。如果我向 CategoryMap 添加更多 Property(x => x.<field name>),它们将按预期获得各自的值。

我的问题是:我是否必须为 table 中的每一列手动添加 Property(x => x.<property name here>,即使它们具有与实体属性相同的名称?我是否缺少任何使其自动映射的配置?

感谢您的宝贵时间。

原来我用错了ModelMapper。我将其更改为 ConventionModelMapper 并且只需要在 class 映射中指定 table 名称即可。

我的新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()));
    }
}

我的部分配置(在同一个程序class中,为简洁起见,其余部分省略)

...
// 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);
...