我有一个像这样的类结构:
public class Person
{
public virtual int Id { get; protected internal set; }
public virtual string Name { get; set; }
}
public class Customer : Person
{
public virtual string AccountNumber { get; set; }
}
Customer被映射为Person(使用 FluentNHibernate 的SubclassMap<T>)的子类,并且表结构是每个子类的表(单独的Person并且Customer表共享一Id列)。
在我的测试中,我打开一个无状态会话并尝试插入一系列Person实体:
using (var stateless = sessionFactory.OpenStatelessSession())
using (var transaction = stateless.BeginTransaction())
{
var persons = new[]
{
new Person { Name = "Alice" },
new Person { Name = "Bob" },
new Customer { Name = "Cathy", AccountNumber = "001" },
new Customer { Name = "Dave", AccountNumber = "002" }
};
foreach (var person in persons)
stateless.Insert(person);
transaction.Commit();
}
如果我在ShowSql打开开关的情况下运行它,我可以看到表上没有生成任何 INSERT语句Person(这意味着它们是批处理的),但是为INSERT表生成了单独的语句Customer(我从中推断这些语句没有被批处理)。
奇怪的是,我发现如果派生类型(即)Customer有它自己的集合(我们称它们为解决关系没有问题。这种行为似乎完全限于多态实体的派生类。OrdersInsert
这是预期的行为吗?如果是这样,有什么方法可以重写上面的插入代码以确保所有子类表也被批处理?
(注意:我使用的SequenceHiLoGenerator是所有 ID,并且我已经进行了相应的配置AdoNetBatchSize,所以据我所知,这不是HiLo批处理的一般问题。我可以看到当批处理操作发生时该表被命中.)