使用NHibernate.Mapping.ByCode构建映射时,无法使用xml映射的joined-subclass来扩展。但可以使用NHibernate.Mapping.ByCode来实现类似的功能。
下面是一个示例,说明如何使用NHibernate.Mapping.ByCode来构建映射,并利用TablePerClassHierarchy来实现类似joined-subclass的扩展。
首先,创建一个基类Entity,定义公共属性和字段:
public class Entity
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
然后,创建派生类Person和Company,并继承自Entity类:
public class Person : Entity
{
public virtual string Email { get; set; }
}
public class Company : Entity
{
public virtual string Address { get; set; }
}
接下来,使用NHibernate.Mapping.ByCode来构建映射。在这个示例中,我们将使用TablePerClassHierarchy来实现扩展的类映射。
var mapper = new ModelMapper();
mapper.Class(map =>
{
map.Id(x => x.Id, m => m.Generator(Generators.Identity));
map.Property(x => x.Name);
});
mapper.Class(map =>
{
map.Property(x => x.Email);
});
mapper.Class(map =>
{
map.Property(x => x.Address);
});
var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
var configuration = new Configuration();
configuration.Configure();
configuration.AddDeserializedMapping(mapping, "NHibernate.Mapping.ByCode");
var sessionFactory = configuration.BuildSessionFactory();
通过以上代码,我们使用NHibernate.Mapping.ByCode构建了Person和Company的映射,并将它们与基类Entity的映射关联起来。
最后,我们可以使用sessionFactory来执行CRUD操作。
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var person = new Person
{
Name = "John Doe",
Email = "john@example.com"
};
var company = new Company
{
Name = "ABC Company",
Address = "123 Main St"
};
session.Save(person);
session.Save(company);
transaction.Commit();
}
}
通过上述代码,我们可以将Person和Company对象保存到数据库中,实现了类似joined-subclass的扩展。