J'utilise FluentNHibernate. Je n'utilise pas la cartographie automatique. J'ai une classe de base qui est sous-classée. Lorsque j'interroge la classe de base, elle effectue une requête supplémentaire sur la sous-classe. Voici la (pièce) exemple de ce que je fais:NHibernate et l'héritage créant un comportement de double requête inattendue?
public class Foo
{
int Id;
string SomeValue;
}
je crée une autre classe qui représente un dossier d'audit de la première et je posséderai:
public class FooAudit : Foo
{
DateTime DateModified;
}
Je crée les correspondances distinctes pour chaque qui vont à leurs propres tables:
public class FooMap : ClassMap<Foo>
{
public FooAuditMap()
{
Table("Foo");
Id(x => x.Id).Column("FOO_ID");
Map(x => x.SomeValue).Column("SOME_VALUE");
}
}
public class FooAuditMap : ClassMap<FooAuditMap>
{
public FooAuditMap()
{
Table("FooAudit");
CompositeId()
.KeyProperty(x => x.DateModified, c => c.ColumnName("AUDIT_DATE"));
.KeyProperty(x => x.Id, c => c.ColumnName("FOO_ID"));
Map(x => x.SomeValue).Column("SOME_VALUE");
}
}
j'effectue une requête sur Foo:
public virtual IEnumerable<Foo> List()
{
using (var session = SessionFactory.OpenSession())
{
return session.CreateCriteria<Foo>().List<Foo>();
}
}
Qui frappe ensuite la base de données deux fois, une fois pour exécuter cette requête sur Foo et à nouveau sur FooAudit.
Pourquoi fait-il deux requêtes? J'ai généré les fichiers HBM et il n'y a absolument rien liant ces classes.
EDIT: Pour être complet, voici à quoi ressemble la configuration bootstrap.
public static ISessionFactory CreateSessionFactory()
{
return Fluently
.Configure()
.Database
(
FluentNHibernate.Cfg
.Db.MsSqlConfiguration.MsSql2005
.ConnectionString(GetConnectionString())
)
.Mappings(m => m
.FluentMappings.AddFromAssemblyOf<Foo>()
.Conventions.Add(typeof(EnumConvention)))
.BuildSessionFactory();
}
Génial, merci! –