私は次のようなクラス構造を持っています:
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
。バッチ操作が発生しているときにテーブルがヒットしていることがわかります。 .)