我有一个像这样的类结构:
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
有它自己的集合(我们称它们为解决关系没有问题。这种行为似乎完全限于多态实体的派生类。Orders
Insert
这是预期的行为吗?如果是这样,有什么方法可以重写上面的插入代码以确保所有子类表也被批处理?
(注意:我使用的SequenceHiLoGenerator
是所有 ID,并且我已经进行了相应的配置AdoNetBatchSize
,所以据我所知,这不是HiLo
批处理的一般问题。我可以看到当批处理操作发生时该表被命中.)