使用 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);
...
我正在使用设置 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);
...